NPOI DataTable导出到Excel

1.添加NuGet包,右键管理NuGet程序包,在浏览中输入NPOI,搜索安装第一个

 2.写方法

sheet.AddMergedRegion(new CellRangeAddress(1, 1, 4, 6));起始行,终止行,起始列,终止列

fs.close()很重要,没有的话会占进程

npoi版本太高导出的excel表会提示有错误,是否修复。

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using System.Data.OleDb;
using System.Collections;

public int ExportToExcel(DataTable dt, string SavePath, string SheetName,string tablename, int startlie)
        {
            int count;
            ISheet sheet = null;
            FileStream fs = new FileStream(SavePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            if (SavePath.IndexOf(".xlsx") > 0) // 2007版本
                workbook = new XSSFWorkbook();
            else if (SavePath.IndexOf(".xls") > 0) // 2003版本
                workbook = new HSSFWorkbook();
            try
            {   //正文格式
                ICellStyle cellStyle = workbook.CreateCellStyle();
                cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0");
                cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                cellStyle.VerticalAlignment = VerticalAlignment.Center;
                // cellStyle.BorderBottom =;
                IFont cellfont = workbook.CreateFont();
                cellfont.FontName = "等线";
                cellfont.FontHeightInPoints = 10;//设置字号
                cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//上
                cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;//下
                cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;//左
                cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;//右
                cellStyle.SetFont(cellfont);
                //正文格式
                if (workbook != null)
                {
                    sheet = workbook.CreateSheet(SheetName);
                }
                else
                {
                    return -1;
                }

                if (1==1) //写入DataTable的列名
                {
                    IRow row0 =sheet.CreateRow(0);
                    row0.CreateCell(0).SetCellValue(tablename);
                    IRow row = sheet.CreateRow(1);
                    for (int j = 0; j < dt.Columns.Count- startlie; ++j)
                    {
                        row.CreateCell(j).SetCellValue(dt.Columns[j+ startlie].ColumnName);
                    }
                    IRow row3 = sheet.CreateRow(2);
                    IRow row4 = sheet.CreateRow(3);
                    for (int j = 0; j < dt.Columns.Count - startlie; ++j)
                    {
                        row3.CreateCell(j).SetCellValue("");
                        row4.CreateCell(j).SetCellValue("");
                    }
                    count = 4;
                }
                for (int i = 0; i < dt.Rows.Count; ++i)
                {
                    IRow row = sheet.CreateRow(count);
                    row.CreateCell(0).SetCellValue(i+1);
                    for (int j = 0; j < dt.Columns.Count- startlie; ++j) 
                    {
                        TextShow(dt.Rows[i][j + startlie].GetType().ToString()+ dt.Rows[i][j + startlie].ToString(), this.richTextBox1);
                        if ((dt.Rows[i][j + startlie].GetType().ToString() == "System.Double"|| dt.Rows[i][j + startlie].GetType().ToString() == "System.Int32") &&j>1) {
                            row.CreateCell(j, CellType.Numeric).SetCellValue(Convert.ToInt32(dt.Rows[i][j+ startlie]));
                        }
                        else { row.CreateCell(j).SetCellValue(dt.Rows[i][j+ startlie].ToString()); }
                    }
                    ++count;
                }
				//合并单元格,根据具体需要进行调整
                sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dt.Columns.Count - startlie - 1));
                sheet.AddMergedRegion(new CellRangeAddress(1, 2, 0, 0));
                sheet.AddMergedRegion(new CellRangeAddress(1, 2, 1, 1));
                sheet.AddMergedRegion(new CellRangeAddress(1, 2, 2, 2));
                sheet.AddMergedRegion(new CellRangeAddress(1, 2, 3, 3));
                sheet.AddMergedRegion(new CellRangeAddress(1, 2, 7, 7));
                sheet.AddMergedRegion(new CellRangeAddress(1, 2, 8, 8));
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 4, 6));
                sheet.AddMergedRegion(new CellRangeAddress(3, 3, 0, 1));
                sheet.GetRow(2).GetCell(4).SetCellValue("A:(2.5,3] km");
                sheet.GetRow(2).GetCell(5).SetCellValue("B:(3,5] km");
                sheet.GetRow(2).GetCell(6).SetCellValue("C: >5 km");
                sheet.GetRow(3).GetCell(0).SetCellValue("合计");
                //设置单元格格式,添加边框
                for (int i = 0; i < sheet.LastRowNum+1; i++)
                {
                    for (int j = 0; j < sheet.GetRow(i).LastCellNum; j++)
                    {
                        sheet.GetRow(i).GetCell(j).CellStyle = cellStyle;
                    }
                }
                IRow row_formula = sheet.GetRow(3);
                for (int j = 2; j < row_formula.LastCellNum; j++) {
                    sheet.AutoSizeColumn(j);//自适应调整列宽
                    string formula = "SUM(" + dic_lie[j+1] + 5.ToString() +":"+ dic_lie[j+1]+(sheet.LastRowNum+1).ToString() + ")";
                    row_formula.GetCell(j).SetCellFormula(formula);
                }
                workbook.Write(fs); //写入到excel
                fs.Close();
                return count;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return -1;
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值