C#中怎么使用Npoi导出Excel合并行列
这篇文章主要讲解了“C#中怎么使用Npoi导出Excel合并行列”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中怎么使用Npoi导出Excel合并行列”吧!
现在用Npoi导出Excel,导出表格是合并行列,如图:
导出的要求:合计列要进行合并,序号一致的要合并。最后一行要合并列。
因为相同序号数量不是固定的,要动态算合并的行数。
合并行列接口:XXX.AddMergedRegion(new CellRangeAddress(开始行, 最后一行, 开始列, 最后一列));
隐藏指定:sheet.SetColumnHidden(cellIndex, true);
引用组件:
NPOI.dll;
NPOI.OOXML.dll;
NPOI.OpenXml4Net.dll;
NPOI.OpenXmlFormats.dll;
ICSharpCode.SharpZipLib.dll;
代码如下:
///<summary>//////</summary>///<paramname="dtSource">数据源</param>///<paramname="strFileName">保存路径</param>///<paramname="dvXH">序号</param>publicvoidExport(DataTabledtSource,stringstrFileName,DataViewdvXH=null){//创建工作簿office2007以上XSSFWorkbookworkbook=newXSSFWorkbook();//为工作簿创建工作表并命名ISheetsheet=workbook.CreateSheet("商品表");ICellStyledateStyle=workbook.CreateCellStyle();IDataFormatformat=workbook.CreateDataFormat();dateStyle.DataFormat=format.GetFormat("yyyy-mm-dd");#region表头及样式intcellIndex=0;IRowheaderRow=sheet.CreateRow(0);for(inti=0;i<dtSource.Columns.Count;i++){#regionMyRegionstringColumnsName=dtSource.Columns[i].ToString();if(dtSource.Columns[i].ColumnName.EndsWith("XH")){ColumnsName="序号";sheet.SetColumnWidth(cellIndex,3000);//sheet.SetColumnHidden(cellIndex,true);隐藏指定列}elseif(dtSource.Columns[i].ColumnName.EndsWith("GoogName")){ColumnsName="商品名称";sheet.SetColumnWidth(cellIndex,10000);//设置列宽}elseif(dtSource.Columns[i].ColumnName.EndsWith("Num")){ColumnsName="数量";sheet.SetColumnWidth(cellIndex,5000);}elseif(dtSource.Columns[i].ColumnName.EndsWith("Summation")){ColumnsName="合计(元)";sheet.SetColumnWidth(cellIndex,5000);}#endregion//设置行高headerRow.HeightInPoints=35;headerRow.CreateCell(cellIndex).SetCellValue(ColumnsName);ICellStyleheadStyle=workbook.CreateCellStyle();headStyle.WrapText=true;IFontfont=workbook.CreateFont();//字体大小font.FontHeightInPoints=12;font.Boldweight=360;headStyle.SetFont(font);headerRow.GetCell(cellIndex).CellStyle=headStyle;cellIndex++;}#endregionintrowIndex=1;//行数一定要从1行开始intcount=1;intstartRow=1;DataViewdvSource=dtSource.DefaultView;if(dvXH!=null){foreach(DataRowViewdrvindvXH){//1-10.11-12,13-14,15-16introwcout=0;dvSource.RowFilter="XH='"+drv["XH"]+"'";foreach(DataRowViewrowindvSource){#region填充内容IRowdataRow=sheet.CreateRow(rowIndex);//序号ICellnewCel0=dataRow.CreateCell(0);ICellStylestyle0=workbook.CreateCellStyle();style0.DataFormat=format.GetFormat("text");newCel0.SetCellValue(row["XH"].ToString());//标的名称ICellnewCel2=dataRow.CreateCell(1);ICellStylestyle2=workbook.CreateCellStyle();style2.DataFormat=format.GetFormat("text");newCel2.SetCellValue(row["GoogName"].ToString());//标的数量ICellnewCel4=dataRow.CreateCell(2);ICellStylestyle4=workbook.CreateCellStyle();style4.DataFormat=format.GetFormat("text");newCel4.SetCellValue(row["Num"].ToString());//合计(元)ICellnewCel8=dataRow.CreateCell(3);ICellStylestyle8=workbook.CreateCellStyle();style8.DataFormat=format.GetFormat("text");newCel8.SetCellValue(row["Summation"].ToString());#endregionrowIndex++;rowcout++;}if(count==1){//合并行数sheet.AddMergedRegion(newCellRangeAddress(startRow,rowcout,3,3));startRow=startRow+rowcout;}else{sheet.AddMergedRegion(newCellRangeAddress(startRow,startRow+rowcout-1,3,3));startRow=startRow+rowcout;}count++;}}else{#regionMyRegionforeach(DataRowViewrowindvSource){#region填充内容IRowdataRow=sheet.CreateRow(rowIndex);//序号ICellnewCel0=dataRow.CreateCell(0);ICellStylestyle0=workbook.CreateCellStyle();style0.DataFormat=format.GetFormat("text");newCel0.SetCellValue(row["XH"].ToString());//商品名称ICellnewCel1=dataRow.CreateCell(1);ICellStylestyle1=workbook.CreateCellStyle();style1.DataFormat=format.GetFormat("text");newCel1.SetCellValue(row["GoogName"].ToString());//数量ICellnewCel2=dataRow.CreateCell(2);ICellStylestyle2=workbook.CreateCellStyle();style2.DataFormat=format.GetFormat("text");newCel2.SetCellValue(row["Num"].ToString());//合计(元)ICellnewCel3=dataRow.CreateCell(3);ICellStylestyle3=workbook.CreateCellStyle();style3.DataFormat=format.GetFormat("text");newCel3.SetCellValue(row["Summation"].ToString());#endregionrowIndex++;}#endregion}#region拼接最后一行IFontfontLast=workbook.CreateFont();fontLast.FontHeightInPoints=30;fontLast.Boldweight=480;IRowdataRowLast=sheet.CreateRow(rowIndex);dataRowLast.HeightInPoints=40;ICellnewCelLast=dataRowLast.CreateCell(0);ICellStylestyleLast=workbook.CreateCellStyle();styleLast.DataFormat=format.GetFormat("text");styleLast.SetFont(fontLast);newCelLast.SetCellValue("制作人:张三");sheet.AddMergedRegion(newCellRangeAddress(rowIndex,rowIndex,0,3));#endregionMemoryStreamstream=newMemoryStream();workbook.Write(stream);varbuf=stream.ToArray();using(FileStreamfs=newFileStream(strFileName,FileMode.Create,FileAccess.Write)){fs.Write(buf,0,buf.Length);fs.Flush();}}
实际运用中,涉及到数据,方法中有很多校验等操作,方法直观可读性不是太好,下面附上简单导出的方法:
实际上导出Excel,总结有几点:
1、引用相关组件
2、创建一个工作簿,创建工作表并命名;
3、设置表头及样式;
4、填充数据;
5、保存数据到指定位置;
///<summary>///简单导出数据///</summary>///<paramname="dtSource">数据源</param>///<paramname="strFileName">保存路径</param>///<paramname="dvXH">序号</param>publicvoidExport1(DataTabledtSource,stringstrFileName){//创建工作簿XSSFWorkbookworkbook=newXSSFWorkbook();//为工作簿创建工作表并命名ISheetsheet=workbook.CreateSheet("商品表");IDataFormatformat=workbook.CreateDataFormat();#region表头及样式intcellIndex=0;IRowheaderRow=sheet.CreateRow(0);for(inti=0;i<dtSource.Columns.Count;i++){//设置行高headerRow.HeightInPoints=35;headerRow.CreateCell(cellIndex).SetCellValue(dtSource.Columns[i].ToString());ICellStyleheadStyle=workbook.CreateCellStyle();headStyle.WrapText=true;IFontfont=workbook.CreateFont();//字体大小font.FontHeightInPoints=12;font.Boldweight=360;headStyle.SetFont(font);headerRow.GetCell(cellIndex).CellStyle=headStyle;cellIndex++;}#endregion#region数据填充introwIndex=1;//行数一定要从1行开始,因为上面已经创建了表头为0行;DataViewdvSource=dtSource.DefaultView;foreach(DataRowrowindtSource.Rows){intColumnIndex=0;IRowdataRow=sheet.CreateRow(rowIndex);foreach(DataColumncolumnindtSource.Columns){//序号ICellnewCel0=dataRow.CreateCell(ColumnIndex);ICellStylestyle0=workbook.CreateCellStyle();style0.DataFormat=format.GetFormat("text");//数据类型newCel0.SetCellValue(row[column.ColumnName].ToString());ColumnIndex++;}rowIndex++;}#endregion#region保存到指定位置MemoryStreamstream=newMemoryStream();workbook.Write(stream);varbuf=stream.ToArray();using(FileStreamfs=newFileStream(strFileName,FileMode.Create,FileAccess.Write)){fs.Write(buf,0,buf.Length);fs.Flush();}#endregion}
感谢各位的阅读,以上就是“C#中怎么使用Npoi导出Excel合并行列”的内容了,经过本文的学习后,相信大家对C#中怎么使用Npoi导出Excel合并行列这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。