zoukankan      html  css  js  c++  java
  • 通过NPOI操作Excel

    最近在做的一个项目中需要生成Excel,通过学习使用NPOI实现了相关需求,写了一个简便操作的类,记录如下:

    public class NPOIHelperForExcel
        {
            #region excel文件属性
    
            //作者
            public string Author { get; set; }
    
            //标题
            public string Title { get; set; }
    
            //主题
            public string Subject { get; set; }
    
            //标记
            public string Keywords { get; set; }
    
            //创建程序信息
            public string ApplicationName { get; set; }
    
            //最后一次保存者
            public string LastAuthor { get; set; }
    
            //备注
            public string Comments { get; set; }
    
            //创建内容的时间
            public DateTime? CreateDateTime { get; set; }
    
            //最后一次打印的时间
            public DateTime? LastPrinted { get; set; }
    
            //最后一次保存的时间
            public DateTime? LastSaveDateTime { get; set; }
    
            //公司
            public string Company { get; set; }
    
            //管理者
            public string Manager { get; set; }
    
            //比例
            public bool Scale { get; set; }
    
            #endregion
    
            #region 导出,将DataTable导出为Excel文件
            /// <summary>
            /// DataTable导出到Excel文件
            /// </summary>
            /// <param name="dtSource">源DataTable</param>
            /// <param name="headerTextList">表头摘要信息</param>
            /// <param name="strFileName">保存位置</param>
            public void Export(DataTable dtSource, List<String> headerTextList, string strFileName)
            {
                using (MemoryStream ms = Export(dtSource, headerTextList))
                {
                    using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
                    {
                        byte[] data = ms.ToArray();
                        fs.Write(data, 0, data.Length);
                        fs.Flush();
                    }
                }
            }
    
            /// <summary>
            /// DataTable导出到Excel的MemoryStream
            /// </summary>
            /// <param name="dtSource">源DataTable</param>
            /// <param name="headerTextList">表头摘要信息</param>
            public MemoryStream Export(DataTable dtSource, List<String> headerTextList)
            {
                HSSFWorkbook workbook = new HSSFWorkbook();
                ISheet sheet = workbook.CreateSheet("sheet1");
    
                //设置Excel文件属性信息
                SetFileProperty(workbook);
    
                HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();
                HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat();
                dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
    
                //计算列宽
                int[] arrColWidth = new int[dtSource.Columns.Count];
                foreach (DataColumn item in dtSource.Columns)
                {
                    arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
                }
                //获取每一列的最大列宽
                for (int i = 0; i < dtSource.Rows.Count; i++)
                {
                    for (int j = 0; j < dtSource.Columns.Count; j++)
                    {
                        int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
                        if (intTemp > arrColWidth[j])
                        {
                            arrColWidth[j] = intTemp;
                        }
                    }
                }
    
                int rowIndex = 0;
                foreach (DataRow row in dtSource.Rows)
                {
                    #region 新建表,填充表头,填充列头,样式
    
                    if (rowIndex == 65535 || rowIndex == 0)
                    {
                        if (rowIndex != 0)
                        {
                            sheet = workbook.CreateSheet();
                        }
    
                        #region 表头及样式
                        for (int i = 0; i < headerTextList.Count; i++)
                        {
                            HSSFRow headerRow = (HSSFRow)sheet.CreateRow(i);
                            headerRow.HeightInPoints = 18;
                            headerRow.CreateCell(0).SetCellValue(headerTextList[i]);
    
                            HSSFCellStyle headerStyle = (HSSFCellStyle)workbook.CreateCellStyle();
                            headerStyle.Alignment = HorizontalAlignment.Left;
                            HSSFFont font = (HSSFFont)workbook.CreateFont();
                            font.FontHeightInPoints = 14;
                            //font.Boldweight = 700;
                            headerStyle.SetFont(font);
                            headerRow.GetCell(0).CellStyle = headerStyle;
                            sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
                        }
                        #endregion
    
                        #region 列头及样式
                        {
                            HSSFRow headerRow = (HSSFRow)sheet.CreateRow(headerTextList.Count);
                            HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
                            headStyle.Alignment = HorizontalAlignment.Center;
                            HSSFFont font = (HSSFFont)workbook.CreateFont();
                            font.FontHeightInPoints = 10;
                            font.Boldweight = 700;
                            headStyle.SetFont(font);
                            foreach (DataColumn column in dtSource.Columns)
                            {
                                headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                                headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
    
                                //设置列宽
                                sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
                            }
                        }
                        #endregion
    
                        rowIndex = headerTextList.Count + 1;
                    }
    
                    #endregion
    
                    #region 填充表格内容
    
                    HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
                    foreach (DataColumn column in dtSource.Columns)
                    {
                        HSSFCell newCell = (HSSFCell)dataRow.CreateCell(column.Ordinal);
    
                        string drValue = row[column].ToString();
    
                        switch (column.DataType.ToString())
                        {
                            case "System.String": //字符串类型
                                newCell.SetCellValue(drValue);
                                break;
                            case "System.DateTime": //日期类型
                                DateTime dateV;
                                DateTime.TryParse(drValue, out dateV);
                                newCell.SetCellValue(dateV);
    
                                newCell.CellStyle = dateStyle; //格式化显示
                                break;
                            case "System.Boolean": //布尔型
                                bool boolV = false;
                                bool.TryParse(drValue, out boolV);
                                newCell.SetCellValue(boolV);
                                break;
                            case "System.Int16": //整型
                            case "System.Int32":
                            case "System.Int64":
                            case "System.Byte":
                                int intV = 0;
                                int.TryParse(drValue, out intV);
                                newCell.SetCellValue(intV);
                                break;
                            case "System.Decimal": //浮点型
                            case "System.Double":
                                double doubV = 0;
                                double.TryParse(drValue, out doubV);
                                newCell.SetCellValue(doubV);
                                break;
                            case "System.DBNull": //空值处理
                                newCell.SetCellValue("");
                                break;
                            default:
                                newCell.SetCellValue("");
                                break;
                        }
    
                    }
    
                    #endregion
    
                    rowIndex++;
                }
                using (MemoryStream ms = new MemoryStream())
                {
                    workbook.Write(ms);
                    ms.Flush();
                    ms.Position = 0;
    
                    return ms;
                }
    
            }
    
            /// <summary>
            /// 用于Web导出
            /// </summary>
            /// <param name="dtSource">源DataTable</param>
            /// <param name="headerTextList">表头摘要信息</param>
            /// <param name="strFileName">文件名</param>
            public void ExportByWeb(DataTable dtSource, List<String> headerTextList, string strFileName)
            {
                HttpContext curContext = HttpContext.Current;
    
                // 设置编码和附件格式
                curContext.Response.ContentType = "application/vnd.ms-excel";
                curContext.Response.ContentEncoding = Encoding.UTF8;
                curContext.Response.Charset = "";
                curContext.Response.AppendHeader("Content-Disposition",
                    "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
    
                curContext.Response.BinaryWrite(Export(dtSource, headerTextList).GetBuffer());
                curContext.Response.End();
            }
            #endregion
    
            #region 导入,将excel读取到DataTable中
            /// <summary>
            /// 读取excel,默认第一行为表头
            /// </summary>
            /// <param name="strFileName">excel文件路径</param>
            /// <returns>DataTable</returns>
            public DataTable Import(string strFileName)
            {
                return Import(strFileName, 0);
            }
    
            /// <summary>
            /// 读取excel
            /// </summary>
            /// <param name="strFileName">excel文件路径</param>
            /// <param name="sheetNum">sheet索引,以0开始</param>
            /// <returns>DataTable</returns>
            public DataTable Import(string strFileName, int sheetNum)
            {
                return Import(strFileName, sheetNum, 1, 1);
            }
    
            /// <summary>
            /// 读取excel
            /// </summary>
            /// <param name="strFileName">excel文件路径</param>
            /// <param name="sheetNum">sheet索引,以0开始</param>
            /// <param name="startRowNum">起始行号,即:表头在Excel中的行号</param>
            /// <param name="startColNum">起始列号</param>
            /// <returns>DataTable</returns>
            public DataTable Import(string strFileName, int sheetNum, int startRowNum, int startColNum)
            {
                return Import(strFileName, sheetNum, startRowNum, -1, startColNum, -1);
            }
    
            /// <summary>
            /// 读取excel
            /// sheet.LastRowNum属性获取的是Excel中该工作表(sheet)的末行行号减1;
            /// headerRow.LastCellNum属性获取的是Excel中该行的列数
            /// </summary>
            /// <param name="strFileName">excel文档路径</param>
            /// <param name="sheetNum">工作表索引,以0开始</param>
            /// <param name="startRowNum">起始行号,即:表头在Excel中的行号</param>
            /// <param name="endRowNum">结束行号</param>
            /// <param name="startColNum">起始列号</param>
            /// <param name="endColNum">结束列号</param>
            /// <returns>DataTable</returns>
            public DataTable Import(string strFileName, int sheetNum, int startRowNum, int endRowNum, int startColNum, int endColNum)
            {
                DataTable dt = new DataTable();
    
                HSSFWorkbook hssfworkbook;
                using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
                {
                    hssfworkbook = new HSSFWorkbook(file);
                }
    
                int sheetCount = hssfworkbook.NumberOfSheets;
    
                sheetNum = sheetNum < 0 || sheetNum > sheetCount - 1 ? 0 : sheetNum;
    
                HSSFSheet sheet = (HSSFSheet)hssfworkbook.GetSheetAt(sheetNum);
    
                HSSFRow headerRow = null;
    
                #region 行列号范围验证
    
                startColNum = startColNum < 0 ? 0 : startColNum;
    
                startRowNum = startRowNum < 1 ? 1 : startRowNum;
    
                headerRow = (HSSFRow)sheet.GetRow(startRowNum - 1);
    
                endColNum = (endColNum > headerRow.LastCellNum || endColNum < 1) ? headerRow.LastCellNum : endColNum;
    
                endRowNum = (endRowNum - 1 > sheet.LastRowNum || endRowNum < 0) ? sheet.LastRowNum + 1 : endColNum;
    
                #endregion
    
                //添加列
                for (int j = startColNum - 1; j < endColNum; j++)
                {
                    HSSFCell cell = (HSSFCell)headerRow.GetCell(j);
                    dt.Columns.Add(cell.ToString());
                }
    
                //添加行
                for (int i = startRowNum; i <= endRowNum - 1; i++)
                {
                    HSSFRow row = (HSSFRow)sheet.GetRow(i);
                    DataRow dataRow = dt.NewRow();
    
                    for (int j = startColNum - 1; j < endColNum; j++)
                    {
                        if (row.GetCell(j) != null)
                            dataRow[j - startColNum + 1] = row.GetCell(j).ToString();
                    }
    
                    dt.Rows.Add(dataRow);
                }
                return dt;
            }
            #endregion
    
            #region 单元格写入
            ///// <summary>
            ///// 给指定单元格写入内容
            ///// </summary>
            ///// <param name="workBook"></param>
            ///// <param name="sheetName"></param>
            ///// <param name="rowNum"></param>
            ///// <param name="colNum"></param>
            ///// <param name="content"></param>
            //public void WriteCell(HSSFWorkbook workBook, string sheetName, int rowNum, int colNum, string content)
            //{
            //    if (workBook == null)
            //    {
            //        throw new Exception("workBook不能为null");
            //    }
            //    WriteCell(workBook, workBook.GetSheetIndex(sheetName), rowNum, colNum, content);
            //}
    
            ///// <summary>
            ///// 给指定单元格写入内容
            ///// </summary>
            ///// <param name="workBook"></param>
            ///// <param name="sheetNum"></param>
            ///// <param name="rowNum"></param>
            ///// <param name="colNum"></param>
            ///// <param name="content"></param>
            ///// <returns></returns>
            //public void WriteCell(HSSFWorkbook workBook, int sheetNum, int rowNum, int colNum, string content)
            //{
            //    if (workBook == null)
            //    {
            //        throw new Exception("workBook不能为null");
            //    }
    
            //    if (workBook.NumberOfSheets < sheetNum || sheetNum < 0)
            //    {
            //        throw new Exception("指定的sheet不存在");
            //    }
    
            //    ISheet sheet = workBook.GetSheetAt(sheetNum - 1);
    
            //    HSSFRow row = (HSSFRow)sheet.GetRow(rowNum) ?? (HSSFRow)sheet.CreateRow(rowNum - 1);
            //    HSSFCell cell = (HSSFCell)row.CreateCell(6);
            //    cell.SetCellValue(content);
    
            //    //using (MemoryStream ms = new MemoryStream())
            //    //{
            //    //    workBook.Write(ms);
            //    //    ms.Flush();
            //    //    ms.Position = 0;
    
            //    //    using (FileStream fs = new FileStream("测试行列写入.xls", FileMode.Create, FileAccess.Write))
            //    //    {
            //    //        byte[] data = ms.ToArray();
            //    //        fs.Write(data, 0, data.Length);
            //    //        fs.Flush();
            //    //    }
            //    //}
            //    //return workBook;
            //}
            #endregion
    
            /// <summary>
            /// 设置Excel文件属性信息
            /// </summary>
            /// <param name="workbook"></param>
            private void SetFileProperty(HSSFWorkbook workbook)
            {

    DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
    dsi.Company = this.Company ?? "";
    dsi.Scale = this.Scale;
    dsi.Manager = this.Manager ?? "";
    workbook.DocumentSummaryInformation = dsi;

    
    

    SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
    si.Author = this.Author ?? "";
    si.ApplicationName = this.ApplicationName ?? "";
    si.LastAuthor = this.LastAuthor ?? "";
    si.Comments = this.Comments ?? "";
    si.Title = this.Title ?? "";
    si.Subject = this.Subject ?? "";
    si.CreateDateTime = this.CreateDateTime ?? DateTime.Now;
    si.Keywords = this.Keywords ?? "";
    si.LastAuthor = this.LastAuthor ?? "";
    si.LastPrinted = this.LastPrinted ?? DateTime.Now;
    si.LastSaveDateTime = this.LastSaveDateTime ?? DateTime.Now;

    //上面的属性必须赋值,不能为null,不然执行到Export方法的"workbook.Write(ms);"处会导致空引用错误。

    workbook.SummaryInformation = si;

    
            }
        }
  • 相关阅读:
    从汇编的角度看待const与#define
    从汇编的角度看待变量类型与sizeof的机制
    按字节对齐分析
    堆内存和栈内存的探索
    string源码实现分析
    string源码分析 ——转载 http://blogs.360.cn/360cloud/2012/11/26/linux-gcc-stl-string-in-depth/
    开始了
    atoi函数的实现——面试
    new与malloc的区别,以及内存分配浅析
    [C]C语言中EOF是什么意思?
  • 原文地址:https://www.cnblogs.com/neverstop/p/3919854.html
Copyright © 2011-2022 走看看