使用NPOI匯出Excel使用日記
阿新 • • 發佈:2021-01-09
技術標籤:C#excelvisual studio
這裡寫目錄標題
一,單元格格式
一,單元格格式
提前設定單元格格式;如果有表頭,列名等欄位需要用到不同的格式,可以新增多個style,一個IWorkbook最多可以有4000個cellStyle,所以相同格式可以設定成靜態變數,避免重複建立相同格式的cellStyle。本文只介紹關於HSSFWorkbook的匯出步驟,因為XSSFWorkbook好像沒有SetEnclosedBorderOfRegion方法,合併單元格的時候邊框設定有問題,不太好看。本人對NPOI瞭解太淺,有了解的夥伴兒還望告知有沒有類似的實現方法。
private void SetCellSty(IWorkbook workbook)
{
ICellStyle cellstyle = workbook.CreateCellStyle();
//下邊框
cellstyle.BorderBottom = BorderStyle.Thin;
//上邊框
cellstyle.BorderTop = BorderStyle.Thin;
//左邊框
cellstyle.BorderLeft = BorderStyle.Thin;
//右邊框
cellstyle.BorderRight = BorderStyle.Thin;
cellstyle.Alignment = HorizontalAlignment.Center;
cellstyle.VerticalAlignment = VerticalAlignment.Center;
//設定字型
IFont font = workbook.CreateFont();
font.FontName = "微軟雅黑";//字型
font.Color = 8;//顏色
//font.FontHeight = 15;//字型高度
font.FontHeightInPoints = 20;//字型高度
font.IsBold = true;//是否加粗
font.IsItalic = false;//是否斜體
font.IsStrikeout = false;//是否加刪除線
cellstyle.SetFont(font);
//設定前景色
//cellstyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
//cellstyle.FillPattern = FillPattern.SolidForeground;
cellStyle_Title = cellstyle;;
}
cell背景是使用前景色FillForegroundColor屬性;不要使用FillBackgroundColor,背景色會把單元格內的字型遮住;
二,建立IWorlBook
private string SaveFilePath()
{
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Title = "請選擇檔案存放路徑";
saveFile.Filter = "Excel文件(*.xls)|*.xls";
if (saveFile.ShowDialog() != DialogResult.OK)
{
return null;
}
return saveFile.FileName;
}
private void tButton1_Click(object sender, EventArgs e)
{
string path = SaveFilePath();
if (".XLS".Equals(Path.GetExtension(path).ToUpper()))
{
IWorkbook workbook = new HSSFWorkbook();
SetCellSty(workbook);
workbook = CreateWorkBook(workbook);
workbook = DataTableToWorkBook(workbook, true);
ExportToExcel(workbook, path);
}
//else if (".XLSX".Equals(Path.GetExtension(path).ToUpper()))
//{
// IWorkbook workbook = new XSSFWorkbook();
// InitializesCellStyle(workbook);
// workbook = CreateWorkBook(workbook);
// workbook = DataTableToWorkBook(workbook, false);
// ExportToExcel(workbook, path);
//}
}
private IWorkbook CreateWorkBook(IWorkbook workbook)
{
ISheet sheet = workbook.CreateSheet("裝置保養表");
sheet.DefaultColumnWidth = 3;
sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 30));//裝置保養表
sheet.AddMergedRegion(new CellRangeAddress(0, 1, 31, 32));//裝置
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 33, 35));//裝置編號
sheet.AddMergedRegion(new CellRangeAddress(1, 1, 33, 35));//裝置型別
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 36, 47));//裝置編號text
sheet.AddMergedRegion(new CellRangeAddress(1, 1, 36, 47));//裝置型別text
sheet.AddMergedRegion(new CellRangeAddress(3, 4, 42, 43));//記錄方法
sheet.AddMergedRegion(new CellRangeAddress(3, 3, 44, 46));//Spec in
sheet.AddMergedRegion(new CellRangeAddress(4, 4, 44, 46));//Spec out
ICell cell = sheet.CreateRow(0).CreateCell(0);
cell.SetCellValue("裝置保養表 PM Sheet");
cell.CellStyle = cellStyle_Title;
ICell cell_eqType = sheet.CreateRow(1).CreateCell(33);
cell_eqType.SetCellValue("裝置型別");
cell_eqType.CellStyle = cellStyle_Body;
ICell cell_Record = sheet.CreateRow(3).CreateCell(42);
cell_Record.SetCellValue("記錄方法");
cell_Record.CellStyle = cellStyle_Body;
ICell cell_out = sheet.CreateRow(4).CreateCell(44);
cell_out.SetCellValue("Spec Out");
cell_out.CellStyle = cellStyle_Body;
ICell cell_EQ = sheet.GetRow(0).CreateCell(31);
cell_EQ.SetCellValue("裝置");
cell_EQ.CellStyle = cellStyle_Body;
ICell cell_EQName = sheet.GetRow(0).CreateCell(36);
cell_EQName.SetCellValue(eqName);
cell_EQName.CellStyle = cellStyle_Body;
ICell cell_EQType = sheet.GetRow(1).CreateCell(36);
cell_EQType.SetCellValue(eqType);
cell_EQType.CellStyle = cellStyle_Body;
ICell cell_eqName = sheet.GetRow(0).CreateCell(33);
cell_eqName.SetCellValue("裝置編號");
cell_eqName.CellStyle = cellStyle_Body;
ICell cell_in = sheet.GetRow(3).CreateCell(44);
cell_in.SetCellValue("Spec In");
cell_in.CellStyle = cellStyle_Body;
ICell cell_O = sheet.GetRow(3).CreateCell(47);
cell_O.SetCellValue("O");
cell_O.CellStyle = cellStyle_Body;
ICell cell_X = sheet.GetRow(4).CreateCell(47);
cell_X.SetCellValue("X");
cell_X.CellStyle = cellStyle_Body;
return workbook;
}
titile大概就是這個樣子,合併的單元格現在沒有邊框的原因是少了一些設定,程式碼在下面。
三,新增行資料
/// <param name="dataSource">資料來源表</param>
/// <param name="workbook">工作簿</param>
/// <param name="rowId">開始行號 </param>
private int SetCell(System.Data.DataTable dataSource, IWorkbook workbook, int rowId)
{
IRow row = sheet.CreateRow(rowId);
{
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 1, 6));
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 7, 10));
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 11, 13));
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 14, 16));
row.CreateCell(0).SetCellValue(tableDaily.Columns[0].ColumnName.ToString());
row.CreateCell(1).SetCellValue(tableDaily.Columns[1].ColumnName.ToString());
row.CreateCell(7).SetCellValue(tableDaily.Columns[2].ColumnName.ToString());
row.CreateCell(11).SetCellValue(tableDaily.Columns[3].ColumnName.ToString());
row.CreateCell(14).SetCellValue(tableDaily.Columns[4].ColumnName.ToString());
}
for (int j = 5; j < columnsCount; j++)
{
row.CreateCell(16 + j - 4).SetCellValue(tableDaily.Columns[j].ColumnName.ToString());
}
foreach (ICell cell in row.Cells)
{
cell.CellStyle = cellStyle_Header;
}
//row.RowStyle = cellStyle_Header;
rowId ++ ;//向下一行
for (int i = 0; i < rowCount; i++)
{
DataRow dataRow = tableDaily.Rows[i];
IRow irow = sheet.CreateRow(rowId);
//irow.RowStyle = cellStyle_Body;
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 1, 6));
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 7, 10));
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 11, 13));
sheet.AddMergedRegion(new CellRangeAddress(rowId, rowId, 14, 16));
//CellRangeAddress region1 = new CellRangeAddress(rowId, rowId, 1, 6);
//CellRangeAddress region2 = new CellRangeAddress(rowId, rowId, 7, 10);
//CellRangeAddress region3 = new CellRangeAddress(rowId, rowId, 11, 13);
//CellRangeAddress region4 = new CellRangeAddress(rowId, rowId, 14, 16);
//sheet.AddMergedRegion(region1);
//sheet.AddMergedRegion(region2);
//sheet.AddMergedRegion(region3);
//sheet.AddMergedRegion(region4);
irow.CreateCell(0).SetCellValue(dataRow[0].ToString());
irow.CreateCell(1).SetCellValue(dataRow[1].ToString());
irow.CreateCell(7).SetCellValue(dataRow[2].ToString());
irow.CreateCell(11).SetCellValue(dataRow[3].ToString());
irow.CreateCell(14).SetCellValue(dataRow[4].ToString());
//下面這一坨就是設定合併單元格的邊框,因為每個都要設定一遍太麻煩,所以迴圈設定的程式碼在最後面
//((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region1, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
//((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region2, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
//((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region3, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
//((HSSFSheet)sheet).SetEnclosedBorderOfRegion(region4, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
for (int j = 5; j < columnsCount; j++)
{
irow.CreateCell(16 + j - 4).SetCellValue(dataRow[j].ToString());
}
foreach (ICell cell in irow.Cells)
{
if ("X".Equals(cell.StringCellValue))
{
cell.CellStyle = cellStyle_XColor;
}
else
{
cell.CellStyle = cellStyle_Body;
}
}
//irow.RowStyle = cellStyle_Body;
rowId ++;
}
return rowId ++;
}
}
生成的樣子應該是這樣的。紅色背景是設定的如果為X就把背景變為紅色
四,匯出
private void ExportToExcel(IWorkbook workbook, string filePath)
{
try
{
//為每個合併單元格設定邊框
List<CellRangeAddress> cellRanges = workbook.GetSheetAt(0).MergedRegions;
foreach (CellRangeAddress region in cellRanges)
{
((HSSFSheet)workbook.GetSheetAt(0)).SetEnclosedBorderOfRegion(region, BorderStyle.Thin, NPOI.HSSF.Util.HSSFColor.Black.Index);
}
FileStream fs = null;
try
{
using (fs = new FileStream(filePath, FileMode.Append, FileAccess.Write))
{
workbook.Write(fs);
}
TAP.UI.TAPMsgBox.Instance.ShowMessage(this.Text, EnumMsgType.INFORMATION, "Export successfully.");
}
finally
{
fs.Close();
workbook.Close();
}
}
catch
{
TAP.UI.TAPMsgBox.Instance.ShowMessage(this.Text, EnumMsgType.INFORMATION, "Execl is using.");
}
}