C#使用Npoi導(dǎo)出Excel并合并行列
在工作開(kāi)發(fā)中,客戶經(jīng)常要求數(shù)據(jù)庫(kù)中數(shù)據(jù)導(dǎo)出到Excel表格。以前方法是引用office相關(guān)組件,如果客戶沒(méi)有安裝office,功能就會(huì)遇到問(wèn)題。
現(xiàn)在用Npoi導(dǎo)出Excel,導(dǎo)出表格是合并行列,如圖:
導(dǎo)出的要求:合計(jì)列要進(jìn)行合并,序號(hào)一致的要合并。最后一行要合并列。
因?yàn)橄嗤蛱?hào)數(shù)量不是固定的,要?jiǎng)討B(tài)算合并的行數(shù)。
合并行列接口:XXX.AddMergedRegion(new CellRangeAddress(開(kāi)始行, 最后一行, 開(kāi)始列, 最后一列));
隱藏指定:sheet.SetColumnHidden(cellIndex, true);
引用組件:
NPOI.dll;
NPOI.OOXML.dll;
NPOI.OpenXml4Net.dll;
NPOI.OpenXmlFormats.dll;
ICSharpCode.SharpZipLib.dll;
代碼如下:
/// <summary> ///? /// </summary> /// <param name="dtSource">數(shù)據(jù)源</param> /// <param name="strFileName">保存路徑</param> /// <param name="dvXH">序號(hào)</param> public void Export(DataTable dtSource,string strFileName,DataView dvXH=null) ? ? ? ? { ? ? ? ? ? ? //創(chuàng)建工作簿 office2007以上 ? ? ? ? ? ? XSSFWorkbook workbook = new XSSFWorkbook(); ? ? ? ? ? ? //為工作簿創(chuàng)建工作表并命名 ? ? ? ? ? ? ISheet sheet = workbook.CreateSheet("商品表"); ? ? ? ? ? ? ICellStyle dateStyle = workbook.CreateCellStyle(); ? ? ? ? ? ? IDataFormat format = workbook.CreateDataFormat(); ? ? ? ? ? ? dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); ? ? ? ? ? ? #region 表頭及樣式 ? ? ? ? ? ? int cellIndex = 0; ? ? ? ? ? ? IRow headerRow = sheet.CreateRow(0); ? ? ? ? ? ? for (int i = 0; i < dtSource.Columns.Count; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? #region MyRegion ? ? ? ? ? ? ? ? string ColumnsName = dtSource.Columns[i].ToString(); ? ? ? ? ? ? ? ? if (dtSource.Columns[i].ColumnName.EndsWith("XH")) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ColumnsName = "序號(hào)"; ? ? ? ? ? ? ? ? ? ? sheet.SetColumnWidth(cellIndex, 3000); ? ? ? ? ? ? ? ? ? ?//sheet.SetColumnHidden(cellIndex, true);隱藏指定列 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if (dtSource.Columns[i].ColumnName.EndsWith("GoogName")) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ColumnsName = "商品名稱"; ? ? ? ? ? ? ? ? ? ? sheet.SetColumnWidth(cellIndex,10000);//設(shè)置列寬 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if (dtSource.Columns[i].ColumnName.EndsWith("Num")) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ColumnsName = "數(shù)量"; ? ? ? ? ? ? ? ? ? ? sheet.SetColumnWidth(cellIndex, 5000); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if (dtSource.Columns[i].ColumnName.EndsWith("Summation")) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ColumnsName = "合計(jì)(元)"; ? ? ? ? ? ? ? ? ? ? sheet.SetColumnWidth(cellIndex, 5000); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? #endregion ? ? ? ? ? ? ? ? //設(shè)置行高 ? ? ? ? ? ? ? ? headerRow.HeightInPoints = 35;? ? ? ? ? ? ? ? ? headerRow.CreateCell(cellIndex).SetCellValue(ColumnsName); ? ? ? ? ? ? ? ? ICellStyle headStyle = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? headStyle.WrapText = true; ? ? ? ? ? ? ? ? IFont font = workbook.CreateFont(); ? ? ? ? ? ? ? ? //字體大小 ? ? ? ? ? ? ? ? font.FontHeightInPoints = 12; ? ? ? ? ? ? ? ? font.Boldweight = 360; ? ? ? ? ? ? ? ? headStyle.SetFont(font); ? ? ? ? ? ? ? ? headerRow.GetCell(cellIndex).CellStyle = headStyle; ? ? ? ? ? ? ? ? cellIndex++; ? ? ? ? ? ? } ? ? ? ? ? ? #endregion ? ? ? ? ? ? int rowIndex = 1;//行數(shù)一定要從1行開(kāi)始 ? ? ? ? ? ? int count = 1; ? ? ? ? ? ? int startRow = 1; ? ? ? ? ? ? DataView dvSource = dtSource.DefaultView; ? ? ? ? ? ? if (dvXH!=null) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? foreach (DataRowView drv in dvXH) ? ? ? ? ? ? ? ? {//1-10.11-12,13-14,15-16 ? ? ? ? ? ? ? ? ? ? int rowcout = 0; ? ? ? ? ? ? ? ? ? ? dvSource.RowFilter = "XH='" + drv["XH"] + "'"; ? ? ? ? ? ? ? ? ? ? foreach (DataRowView row in dvSource) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? #region 填充內(nèi)容 ? ? ? ? ? ? ? ? ? ? ? ? IRow dataRow = sheet.CreateRow(rowIndex); ? ? ? ? ? ? ? ? ? ? ? ? //序號(hào) ? ? ? ? ? ? ? ? ? ? ? ? ICell newCel0 = dataRow.CreateCell(0); ? ? ? ? ? ? ? ? ? ? ? ? ICellStyle style0 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? ? ? style0.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? ? ? newCel0.SetCellValue(row["XH"].ToString()); ? ? ? ? ? ? ? ? ? ? ? ? //標(biāo)的名稱 ? ? ? ? ? ? ? ? ? ? ? ? ICell newCel2 = dataRow.CreateCell(1); ? ? ? ? ? ? ? ? ? ? ? ? ICellStyle style2 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? ? ? style2.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? ? ? newCel2.SetCellValue(row["GoogName"].ToString()); ? ? ? ? ? ? ? ? ? ? ? ? //標(biāo)的數(shù)量 ? ? ? ? ? ? ? ? ? ? ? ? ICell newCel4 = dataRow.CreateCell(2); ? ? ? ? ? ? ? ? ? ? ? ? ICellStyle style4 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? ? ? style4.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? ? ? newCel4.SetCellValue(row["Num"].ToString()); ? ? ? ? ? ? ? ? ? ? ? ? //合計(jì)(元) ? ? ? ? ? ? ? ? ? ? ? ? ICell newCel8 = dataRow.CreateCell(3); ? ? ? ? ? ? ? ? ? ? ? ? ICellStyle style8 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? ? ? style8.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? ? ? newCel8.SetCellValue(row["Summation"].ToString()); ? ? ? ? ? ? ? ? ? ? ? ? #endregion ? ? ? ? ? ? ? ? ? ? ? ? rowIndex++; ? ? ? ? ? ? ? ? ? ? ? ? rowcout++; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? if (count == 1) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? //合并行數(shù) ? ? ? ? ? ? ? ? ? ? ? ? sheet.AddMergedRegion(new CellRangeAddress(startRow, rowcout, 3, 3)); ? ? ? ? ? ? ? ? ? ? ? ? startRow = startRow + rowcout; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? sheet.AddMergedRegion(new CellRangeAddress(startRow, startRow + rowcout - 1, 3, 3)); ? ? ? ? ? ? ? ? ? ? ? ? startRow = startRow + rowcout; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? count++; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? #region MyRegion ? ? ? ? ? ? ? ? foreach (DataRowView row in dvSource) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? #region 填充內(nèi)容 ? ? ? ? ? ? ? ? ? ? IRow dataRow = sheet.CreateRow(rowIndex); ? ? ? ? ? ? ? ? ? ? //序號(hào) ? ? ? ? ? ? ? ? ? ? ICell newCel0 = dataRow.CreateCell(0); ? ? ? ? ? ? ? ? ? ? ICellStyle style0 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? style0.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? newCel0.SetCellValue(row["XH"].ToString()); ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? //商品名稱 ? ? ? ? ? ? ? ? ? ? ICell newCel1 = dataRow.CreateCell(1); ? ? ? ? ? ? ? ? ? ? ICellStyle style1 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? style1.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? newCel1.SetCellValue(row["GoogName"].ToString()); ? ? ? ? ? ? ? ? ? ? //數(shù)量 ? ? ? ? ? ? ? ? ? ? ICell newCel2 = dataRow.CreateCell(2); ? ? ? ? ? ? ? ? ? ? ICellStyle style2 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? style2.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? newCel2.SetCellValue(row["Num"].ToString()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //合計(jì)(元) ? ? ? ? ? ? ? ? ? ? ICell newCel3 = dataRow.CreateCell(3); ? ? ? ? ? ? ? ? ? ? ICellStyle style3 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? style3.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? newCel3.SetCellValue(row["Summation"].ToString()); ? ? ? ? ? ? ? ? ? ? #endregion ? ? ? ? ? ? ? ? ? ? rowIndex++; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? #endregion ? ? ? ? ? ? } ? ? ? ? ? ? #region 拼接最后一行 ? ? ? ? ? ? IFont fontLast = workbook.CreateFont(); ? ? ? ? ? ? fontLast.FontHeightInPoints = 30; ? ? ? ? ? ? fontLast.Boldweight = 480; ? ? ? ? ? ? IRow dataRowLast = sheet.CreateRow(rowIndex); ? ? ? ? ? ? dataRowLast.HeightInPoints = 40; ? ? ? ? ? ? ICell newCelLast = dataRowLast.CreateCell(0); ? ? ? ? ? ? ICellStyle styleLast = workbook.CreateCellStyle(); ? ? ? ? ? ? styleLast.DataFormat = format.GetFormat("text"); ? ? ? ? ? ? styleLast.SetFont(fontLast); ? ? ? ? ? ? newCelLast.SetCellValue("制作人:張三"); ? ? ? ? ? ? sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, 3)); ? ? ? ? ? ? #endregion ? ? ? ? ? ? MemoryStream stream = new MemoryStream(); ? ? ? ? ? ? workbook.Write(stream); ? ? ? ? ? ? var buf = stream.ToArray(); ? ? ? ? ? ? using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? fs.Write(buf, 0, buf.Length); ? ? ? ? ? ? ? ? fs.Flush(); ? } }
實(shí)際運(yùn)用中,涉及到數(shù)據(jù),方法中有很多校驗(yàn)等操作,方法直觀可讀性不是太好,下面附上簡(jiǎn)單導(dǎo)出的方法:
實(shí)際上導(dǎo)出Excel,總結(jié)有幾點(diǎn):
1、引用相關(guān)組件
2、創(chuàng)建一個(gè)工作簿,創(chuàng)建工作表并命名;
3、設(shè)置表頭及樣式;
4、填充數(shù)據(jù);
5、保存數(shù)據(jù)到指定位置;
/// <summary> /// 簡(jiǎn)單導(dǎo)出數(shù)據(jù) /// </summary> /// <param name="dtSource">數(shù)據(jù)源</param> /// <param name="strFileName">保存路徑</param> /// <param name="dvXH">序號(hào)</param> ? ? ? ? public void Export1(DataTable dtSource, string strFileName) ? ? ? ? { ? ? ? ? ? ? //創(chuàng)建工作簿 ? ? ? ? ? ? XSSFWorkbook workbook = new XSSFWorkbook(); ? ? ? ? ? ? //為工作簿創(chuàng)建工作表并命名 ? ? ? ? ? ? ISheet sheet = workbook.CreateSheet("商品表"); ? ? ? ? ? ? IDataFormat format = workbook.CreateDataFormat(); ? ? ? ? ? ? #region 表頭及樣式 ? ? ? ? ? ? int cellIndex = 0; ? ? ? ? ? ? IRow headerRow = sheet.CreateRow(0); ? ? ? ? ? ? for (int i = 0; i < dtSource.Columns.Count; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //設(shè)置行高 ? ? ? ? ? ? ? ? headerRow.HeightInPoints = 35; ? ? ? ? ? ? ? ? headerRow.CreateCell(cellIndex).SetCellValue(dtSource.Columns[i].ToString()); ? ? ? ? ? ? ? ? ICellStyle headStyle = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? headStyle.WrapText = true; ? ? ? ? ? ? ? ? IFont font = workbook.CreateFont(); ? ? ? ? ? ? ? ? //字體大小 ? ? ? ? ? ? ? ? font.FontHeightInPoints = 12; ? ? ? ? ? ? ? ? font.Boldweight = 360; ? ? ? ? ? ? ? ? headStyle.SetFont(font); ? ? ? ? ? ? ? ? headerRow.GetCell(cellIndex).CellStyle = headStyle; ? ? ? ? ? ? ? ? cellIndex++; ? ? ? ? ? ? } ? ? ? ? ? ? #endregion ? ? ? ? ? ? #region 數(shù)據(jù)填充 ? ? ? ? ? ? int rowIndex = 1;//行數(shù)一定要從1行開(kāi)始,因?yàn)樯厦嬉呀?jīng)創(chuàng)建了表頭為0行; ? ? ? ? ? ? DataView dvSource = dtSource.DefaultView; ? ? ? ? ? ? foreach (DataRow row in dtSource.Rows) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int ColumnIndex = 0; ? ? ? ? ? ? ? ? IRow dataRow = sheet.CreateRow(rowIndex); ? ? ? ? ? ? ? ? foreach (DataColumn column in dtSource.Columns) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //序號(hào) ? ? ? ? ? ? ? ? ? ? ICell newCel0 = dataRow.CreateCell(ColumnIndex); ? ? ? ? ? ? ? ? ? ? ICellStyle style0 = workbook.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? style0.DataFormat = format.GetFormat("text");//數(shù)據(jù)類型 ? ? ? ? ? ? ? ? ? ? newCel0.SetCellValue(row[column.ColumnName].ToString()); ? ? ? ? ? ? ? ? ? ? ColumnIndex++; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? rowIndex++; ? ? ? ? ? ? } ? ? ? ? ? ? #endregion ? ? ? ? ? ? #region 保存到指定位置 ? ? ? ? ? ? MemoryStream stream = new MemoryStream(); ? ? ? ? ? ? workbook.Write(stream); ? ? ? ? ? ? var buf = stream.ToArray(); ? ? ? ? ? ? using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? fs.Write(buf, 0, buf.Length); ? ? ? ? ? ? ? ? fs.Flush(); ? ? ? ? ? ? } ? ? ? ? ? ? #endregion }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c#學(xué)習(xí)教程之JSON文件及解析實(shí)例
json作為互聯(lián)網(wǎng)上輕量便捷的數(shù)據(jù)傳輸格式,越來(lái)越受到重視,下面這篇文章主要給大家介紹了關(guān)于c#學(xué)習(xí)教程之JSON文件及解析的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08C#?HttpClient超時(shí)重試機(jī)制詳解
超時(shí)重試的實(shí)現(xiàn)方式可以使用循環(huán)結(jié)構(gòu),在請(qǐng)求發(fā)起后等待一定時(shí)間,若超時(shí)未收到響應(yīng),則再次發(fā)起請(qǐng)求,循環(huán)次數(shù)可以根據(jù)實(shí)際情況進(jìn)行設(shè)置,一般建議不超過(guò)三次,這篇文章主要介紹了C#?HttpClient超時(shí)重試,需要的朋友可以參考下2023-06-06C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺(tái)的操作方法
這篇文章主要介紹了C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺(tái),上傳視頻功能,主要要解決兩個(gè)問(wèn)題,一是在服務(wù)端通過(guò)C#生成簽名和SDKID,二是在客戶端通過(guò)JavaScript上傳視頻到騰訊云點(diǎn)播服務(wù)器,感興趣的朋友跟隨小編一起看看吧2023-11-11C#基于Modbus三種CRC16校驗(yàn)方法的性能對(duì)比
這篇文章主要介紹了C#基于Modbus三種CRC16校驗(yàn)方法的性能對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11