|
|
|
ปัญหาการ Download excel file จากการ generate โดยใช้ EPPLUS บน C# ASP.NET .NET FrameWork 4.6.1 |
|
|
|
|
|
|
|
ผมกำลังหาวิธีการ Export excel file จากข้อมูลใน DB โดยใช้ EPPLUS ตอนนี้สามารถ Download file ได้ แต่ไม่สาสารถอ่าน file ได้ครับ
ส่วนนี้เป็น Code ฝั่ง script ที่ผมใช้ครับ
Code (JavaScript)
$.ajax({
type: "POST",
crossOrigin: true,
url: "/api/Transaction/ExportExcel",
headers: {
Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
},
data: {
"Date_1": dateTime[0],
"Date_2": dateTime[2],
"PaymentType": (paymentType === "99" ? '' : paymentType),
"Status": (paymentStatus === "99" ? '' : paymentStatus),
"Outtrade": refNo,
"Merchant": (merchantName == "00" ? '' : merchantName),
"TerminalID": terminalId
},
success: function (result) {
if (dateTime[0] == dateTime[2]) {
filename = "Transaction_Detail_" + dateTime[0].replace(/\//g, '-') + ".xlsx";
}
else {
filename = "Transaction_Detail_" + dateTime[0].replace(/\//g, '-') + " - " + dateTime[2].replace(/\//g, '-') + ".xlsx";
}
var uri = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,' + result;
var link = document.createElement("a");
link.href = uri;
link.style = "visibility:hidden";
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
error: function (jqXHR, exception) {
console.log("Post error");
$('#btnApply').removeAttr("disabled");
$('#btnExportExcel').removeAttr("disabled");
getErrorMessage(jqXHR, exception);
}
});
return deferred.promise();
});
ส่วนนี้เป็น Code ฝั่ง Web API ที่ผมใช้ครับ
Code (C#)
public class TransactionController : ApiController
{
[AllowAnonymous]
[HttpPost]
[Route("api/Transaction/ExportExcel")]
public HttpResponseMessage ExportExcel(TransactionSearchReq req)
{
TransactionMgr transaction = new TransactionMgr();
List<TransactionRecordRes> transactionList = new List<TransactionRecordRes>();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
//MediaTypeHeaderValue mediaType = MediaTypeHeaderValue.Parse("application/octet-stream");
MediaTypeHeaderValue mediaType = MediaTypeHeaderValue.Parse("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//response.Content = new StringContent("hello", Encoding.Unicode);
byte[] fileContents;
string fileName;
try
{
// Get transaction records
transactionList = transaction.GetSearchTransactionRecord(req);
if (transactionList.Count() > 0)
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
//var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("Sheet1");
// Put whatever you want here in the sheet
worksheet.Cells["A1"].Value = "Date Time";
worksheet.Cells["A1"].Style.Font.Size = 12;
worksheet.Cells["A1"].Style.Font.Bold = true;
worksheet.Cells["A1"].Style.Border.Top.Style = ExcelBorderStyle.Hair;
worksheet.Cells["B1"].Value = "Merchant Name";
worksheet.Cells["B1"].Style.Font.Size = 12;
worksheet.Cells["B1"].Style.Font.Bold = true;
worksheet.Cells["B1"].Style.Border.Top.Style = ExcelBorderStyle.Hair;
worksheet.Cells["C1"].Value = "Terminal ID";
worksheet.Cells["C1"].Style.Font.Size = 12;
worksheet.Cells["C1"].Style.Font.Bold = true;
worksheet.Cells["C1"].Style.Border.Top.Style = ExcelBorderStyle.Hair;
worksheet.Cells["D1"].Value = "Payment Type";
worksheet.Cells["D1"].Style.Font.Size = 12;
worksheet.Cells["D1"].Style.Font.Bold = true;
worksheet.Cells["D1"].Style.Border.Top.Style = ExcelBorderStyle.Hair;
worksheet.Cells["E1"].Value = "Outtrade";
worksheet.Cells["E1"].Style.Font.Size = 12;
worksheet.Cells["E1"].Style.Font.Bold = true;
worksheet.Cells["E1"].Style.Border.Top.Style = ExcelBorderStyle.Hair;
worksheet.Cells["F1"].Value = "Amount";
worksheet.Cells["F1"].Style.Font.Size = 12;
worksheet.Cells["F1"].Style.Font.Bold = true;
worksheet.Cells["F1"].Style.Border.Top.Style = ExcelBorderStyle.Hair;
worksheet.Cells["G1"].Value = "Status";
worksheet.Cells["G1"].Style.Font.Size = 12;
worksheet.Cells["G1"].Style.Font.Bold = true;
worksheet.Cells["G1"].Style.Border.Top.Style = ExcelBorderStyle.Hair;
for (int i = 0; i < transactionList.Count(); i++)
{
worksheet.Cells[i + 2, 1].Value = transactionList[i].DateTime;
worksheet.Cells[i + 2, 2].Value = transactionList[i].Merchant;
worksheet.Cells[i + 2, 3].Value = transactionList[i].TerminalID;
worksheet.Cells[i + 2, 4].Value = transactionList[i].PaymentType;
worksheet.Cells[i + 2, 5].Value = transactionList[i].Outtrade;
worksheet.Cells[i + 2, 6].Value = transactionList[i].Amount;
worksheet.Cells[i + 2, 7].Value = transactionList[i].Status;
}
// So many things you can try but you got the idea.
// Finally when you're done, export it to byte array.
fileContents = package.GetAsByteArray();
}
if (fileContents == null || fileContents.Length == 0)
{
response = Request.CreateResponse(HttpStatusCode.InternalServerError);
response.Content = new StringContent("Export file error.", Encoding.Unicode);
//return NotFound();
return response;
}
else
{
if (string.Compare(req.Date_1, req.Date_2) == 0)
{
fileName = string.Format("Transaction_Detail_{0}.xlsx", req.Date_1.Replace('/', '-'));
}
else
{
fileName = string.Format("Transaction_Detail_{0} - {1}.xlsx", req.Date_1.Replace('/', '-'), req.Date_2.Replace('/', '-'));
}
//return File( fileContents, contentType, fileName );
MemoryStream memoryStream = new MemoryStream(fileContents);
response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentType = mediaType;
response.Content.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment") { FileName = fileName };
return response;
}
}
else
{
response = Request.CreateResponse(HttpStatusCode.InternalServerError);
response.Content = new StringContent("Export file error.", Encoding.Unicode);
//return NotFound();
return response;
}
}
catch (Exception ex)
{
response = Request.CreateResponse(HttpStatusCode.InternalServerError);
response.Content = new StringContent("Export file error.", Encoding.Unicode);
//return NotFound();
return response;
}
}
}
อยากทราบว่าปัญหาเกิดจากอะไร และรบกวนขอวิธีแก้ปัญหาด้วยครับ
ขอบคุณครับ
Tag : .NET, jQuery, Excel (Excel.Application), Web (ASP.NET), Web API, MVC
|
|
|
|
|
|
Date :
2020-03-12 11:25:34 |
By :
muramasa.shin |
View :
1582 |
Reply :
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ContentType ลองเปลี่ยนเป็น "application/vnd.ms-excel" ดูครับ
และ/หรือ
เปลี่ยน/เพิ่ม(Header) content-disposition เป็น "attachment;filename=ชื่อไฟล์.xlsx"
อันที่สองเพิ่งเห็นว่ามีแล้ว
|
ประวัติการแก้ไข 2020-03-12 12:08:30 2020-03-12 12:10:04
|
|
|
|
Date :
2020-03-12 12:07:32 |
By :
PhrayaDev |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองเช็ค file ดูก่อนไหมครับ เห็น error บอกว่า ผิด format หรือไฟล์เสีย
และตรวจเช็ค version ของ .xlsx ด้วยครับ และ/หรือ เครื่องนี้ใช้ได้แค่ .xls
ปล. เครื่องนี้ server ใช้ os อะไรครับ
ได้ลง office ไว้ไหม version อะไร
|
ประวัติการแก้ไข 2020-03-12 14:28:58 2020-03-12 14:29:45
|
|
|
|
Date :
2020-03-12 14:27:42 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตรวจสอบ reference ดูอีกที่ครับ อ้างอิง library ของ office 2016 จริงหรือเปล่า บางทีอ้างอิง ผิด library
|
|
|
|
|
Date :
2020-03-12 16:56:02 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ เจ้าของกระทู้
คุณมั่นใจแค่ไหน return deferred.promise();
ผมเข้าใจ TypeScript/JavaScript ไม่ได้มากไปกว่าคุณ
Code (JavaScript)
async function fuckAjax(fuck) {
return $.ajax({
url: 'your/meThod/'+fuck,
type: 'get',
dataType: 'json',
})
.then(response => response.data);
}
let fuckAgain = await fuckAjax('data');
|
|
|
|
|
Date :
2020-03-14 13:28:49 |
By :
หน้าฮี |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Chaidhanan
จริงฯแล้วไม่มีอะไรเลยครับท่าน ไอ้เด็กห่าพวกนี้คิดอะไรไม่เป็น
เป็นกระผม ผมไม่มาเสียเวลาทำให้เป็น Excel/etc...
เป็นเด็กแต่หัวสมองเป็นคนแก่วัย ห่าลากพวกนี้
ปล. ด่าเล่นไปอย่างนั้นแหละ ไม่ได้จริงจังอะไร
|
|
|
|
|
Date :
2020-03-14 13:44:16 |
By :
หน้าฮี |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 01
|