ASP.NET 匯出gridview中的資料到Excel表中,並對指定單元格換行操作

weixin_30588675發表於2020-04-05

   1. 使用NPOI讀取及生成excel表。

      (1)匯出Click事件:

        獲取DataTable;

       給檔案加檔名: string xlsxName = "xxx_" + DateTime.Now.ToString("yyyyMMddHHmm") + ".xlsx";

       (注:.xlsx是Office2007使用的,是用新的基於XML的壓縮檔案格式取代了其目前專有的預設檔案格式,在傳統的檔名副檔名後面新增了字母x(即:docx取代doc、.xlsx取代xls等等),使其佔用空間更小; .xls是可以使用Microsoft Excel開啟,Office2003及之前版本文件的副檔名)

       定義一個方法: TableToExcelForXLSX(dt);

      (2)//使用NPOI:NPOI 是 POI 專案的 .NET 版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2元件文件的專案。優勢:可以在伺服器上未安裝office的情況下,對Word、excel文件進行讀寫操作。

private void TableToExcelForXLSX(DataTable dt)
{

XSSFWorkbook xssfworkbook = new XSSFWorkbook();    //XSSFWorkbook :用於表示高及低層次excel檔案格式的類,實現workbook介面。

ISheet sheet = xssfworkbook.CreateSheet("Result");      //ISheet:是一個工作表的高階表示,Row:行;Cell:單元格

//迴圈新增表頭
IRow row = sheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);

}

row.Cells[0].SetCellValue("RowNum");//1
row.Cells[1].SetCellValue("Type");//2
row.Cells[2].SetCellValue("PN(B)");//3
row.Cells[3].SetCellValue("PN(S)");//4
row.Cells[4].SetCellValue("ODMPN");//5
row.Cells[5].SetCellValue("OSSPPN");//6
row.Cells[6].SetCellValue("CT#");//7
row.Cells[7].SetCellValue("SecurityID");//8
row.Cells[8].SetCellValue("BOXID");//9
row.Cells[9].SetCellValue("FLOWTAG");//10
row.Cells[10].SetCellValue("IOTKNO");//11
row.Cells[11].SetCellValue("KITCATE");//12
row.Cells[12].SetCellValue("PROCESSLINE");//13
row.Cells[13].SetCellValue("Comment");//14
row.Cells[14].SetCellValue("CREATE_T");//15
row.Cells[15].SetCellValue("REMARK");//16

 

 

 //填充excel的單元格

for (int i = 0; i < dt.Rows.Count; i++)
{

IRow row1 = sheet.CreateRow(i + 1);

for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
}
row1.Cells[0].SetCellValue(dt.Rows[i]["RowNum"].ConvertObjToStr().Trim());//1
row1.Cells[1].SetCellValue(dt.Rows[i]["Type"].ConvertObjToStr().Trim());//2
row1.Cells[2].SetCellValue(dt.Rows[i]["PN(B)"].ConvertObjToStr().Trim());//3
row1.Cells[3].SetCellValue(dt.Rows[i]["PN(S)"].ConvertObjToStr().Trim());//4
row1.Cells[4].SetCellValue(dt.Rows[i]["ODMPN"].ConvertObjToStr().Trim());//5
row1.Cells[5].SetCellValue(dt.Rows[i]["OSSPPN"].ConvertObjToStr().Trim());//6
row1.Cells[6].SetCellValue(dt.Rows[i]["CT#"].ConvertObjToStr().Trim());//7
row1.Cells[7].SetCellValue(dt.Rows[i]["SecurityID"].ConvertObjToStr().Trim());//8
row1.Cells[8].SetCellValue(dt.Rows[i]["BOXID"].ConvertObjToStr().Trim());//9
row1.Cells[9].SetCellValue(dt.Rows[i]["FLOWTAG"].ConvertObjToStr().Trim());//10
row1.Cells[10].SetCellValue(dt.Rows[i]["IOTKNO"].ConvertObjToStr().Trim());//11
row1.Cells[11].SetCellValue(dt.Rows[i]["KITCATE"].ConvertObjToStr().Trim());//12
row1.Cells[12].SetCellValue(dt.Rows[i]["PROCESSLINE"].ConvertObjToStr().Trim());//13

if (dt.Rows[i][13].ConvertObjToStr().Trim().Contains("<br"))
{
ICellStyle cs = xssfworkbook.CreateCellStyle();
cs.WrapText = true;
row1.Cells[13].CellStyle = cs;
}
row1.Cells[13].SetCellValue(dt.Rows[i]["Comment"].ConvertObjToStr().Trim().Replace("<br style=mso-data-placement:same-cell/>", Environment.NewLine));//14
//Environment.NewLine 或 ‘\r\n’:都有在excel表中的單元格有換行的效果。注:只做此換行,在excel表中,需雙擊單元格,才會有效果。所以需要加上面的程式碼。


row1.Cells[14].SetCellValue(dt.Rows[i]["CREATE_T"].ConvertObjToStr().Trim());//15
row1.Cells[15].SetCellValue(dt.Rows[i]["REMARK"].ConvertObjToStr().Trim());//16


for (int ColumnsNum = 0; ColumnsNum < dt.Columns.Count; ColumnsNum++)
{
int columnWidth = sheet.GetColumnWidth(ColumnsNum) / 256;
string s = row1.Cells[ColumnsNum].ConvertObjToStr().Trim();

int length = Encoding.UTF8.GetBytes(s).Length;//獲取當前單元格的內容寬度  
if (length == 0)
{
length = 10;
}

if (columnWidth < length + 1)
{
columnWidth = length + 1;
}//若當前單元格內容寬度大於列寬,則調整列寬為當前單元格寬度


sheet.SetColumnWidth(ColumnsNum, columnWidth * 256);
}
}
//設定單元格的高度
row.Height = 15 * 20;
//設定單元格的寬度
sheet.SetColumnWidth(13, 25 * 256);

//匯出到Excel(.XLSX)

Response.Clear();
Response.Buffer = true;
byte[] bytes = null;
Response.ContentType = "application/ms-excel";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + path);

//轉為位元組陣列
using (MemoryStream stream = new MemoryStream())
{
xssfworkbook.Write(stream);
bytes = stream.ToArray();
stream.Close();
stream.Dispose();
}

Response.BinaryWrite(bytes);
Response.End();
}

 

 

轉載於:https://www.cnblogs.com/bonnie-w/p/6023800.html

相關文章