.NET使用NPOI2.0导入导出Excel

NPOI开源地址:http://npoi.codeplex.com/

NPOI教程: http://tonyqus.sinaapp.com/

具体的不在这里写了,感兴趣的可以去官网。

先来说导出的例子

private void ExportExcel()
        {
            DataTable table_data = MAYIXUE.BLL.NPOIUtility.GetValue();

            HSSFWorkbook hssfworkbook = new HSSFWorkbook();
            ISheet sheet1 = hssfworkbook.CreateSheet("mayixue的NPOI测试1");

            ICellStyle cellStyle = hssfworkbook.CreateCellStyle();
            cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
            ICellStyle stringStyle = hssfworkbook.CreateCellStyle();
            stringStyle.VerticalAlignment = VerticalAlignment.CENTER;

            //取得列宽
            int columnCount = table_data.Columns.Count;
            int[] arrColWidth = new int[columnCount];
            int width = 10;
            foreach (DataColumn column in table_data.Columns)
            {
                arrColWidth[column.Ordinal] = width;
            }

            int rowIndex = 0;
            string temp_col1 = "";
            int col1_s = 0;

            foreach (DataRow row in table_type.Rows)
            {
                #region 新建表,填充列头,样式
                if (rowIndex == 65535 || rowIndex == 0)
                {
                    if (rowIndex != 0)
                    {
                        sheet1 = hssfworkbook.CreateSheet();
                    }

                    #region 列头及样式

                    IRow headerRow = sheet1.CreateRow(0);

                    ICellStyle headStyle = hssfworkbook.CreateCellStyle();
                    headStyle.Alignment = HorizontalAlignment.CENTER;
                    headStyle.VerticalAlignment = VerticalAlignment.CENTER;

                    IFont font = hssfworkbook.CreateFont();
                    font.FontHeightInPoints = 10;
                    font.Boldweight = 700;
                    headStyle.SetFont(font);

                    foreach (DataColumn column in table_type.Columns)
                    {
                        headerRow.CreateCell(column.Ordinal).SetCellValue(Convert.ToInt32(column.ColumnName));

                        headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
                        sheet1.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);//设置列宽

                    }

                    #endregion

                    rowIndex = 1;
                }
                #endregion


                #region 填充内容

                int j = 1;
                IRow dataRow = sheet1.CreateRow(rowIndex);
                foreach (DataColumn column in table_data.Columns)
                {
                    ICell newCell = dataRow.CreateCell(column.Ordinal);

                    string drValue = row[column].ToString();

                    switch (column.DataType.ToString())
                    {
                        case "System.String"://字符串类型
                            newCell.SetCellValue(drValue);
                            newCell.CellStyle = stringStyle;
                            break;
                        case "System.Double":
                            if (drValue != "")
                            {
                                double doubV = 0;
                                double.TryParse(drValue, out doubV);
                                newCell.SetCellValue(doubV);
                            }
                            else
                            {
                                newCell.SetCellValue("");
                            }
                            newCell.CellStyle = cellStyle;
                            break;
                    }

                    #region 单元格合并(这里只合并第一列)

                        if (j == 1 && temp_col1 != drValue) 
                        {
                            if (temp_col1 != "")
                            {
                                sheet1.AddMergedRegion(new CellRangeAddress(col1_s, rowIndex - 1, 0, 0));
                            }
                            temp_c1 = drValue;
                            col1_s = rowIndex;
                        }
                   
                    #endregion

                    j++;
                }
                #endregion

                rowIndex++;
            }

            //冻结窗口  锁定表头和第一列
            sheet1.CreateFreezePane(1, 1, 1, 1);

            //输出
            context.Response.ContentType = "application/vnd.ms-excel";
            context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "mayixue的NPOI测试.xls"));
            context.Response.Clear();

            MemoryStream file = new MemoryStream();
            hssfworkbook.Write(file);
            file.WriteTo(context.Response.OutputStream);
            context.Response.End();
        }

 

再来看下导入Excel到DataTable

/// <summary>  
        /// 读取Excel文件到DataSet中  
        /// </summary>  
        /// <param name="filePath">文件路径</param>  
        /// <returns></returns>  
        private DataTable ExcelToDataTable(string filePath)
        {
            DataTable dt = new DataTable();

            HSSFWorkbook hssfworkbook;
            using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                hssfworkbook = new HSSFWorkbook(file);
            }
            ISheet sheet = hssfworkbook.GetSheetAt(0);
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

            IRow headerRow = sheet.GetRow(0);
            int cellCount = headerRow.LastCellNum;

            for (int j = 0; j < cellCount; j++)
            {
                ICell cell = headerRow.GetCell(j);
                dt.Columns.Add(cell.ToString());
            }

            for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
            {
                IRow row = sheet.GetRow(i);
                DataRow dataRow = dt.NewRow();

                for (int j = row.FirstCellNum; j < cellCount; j++)
                {
                    if (row.GetCell(j) != null)
                        dataRow[j] = row.GetCell(j).ToString();
                }

                dt.Rows.Add(dataRow);
            }
            return dt;
        }

 NPOI升级后语法上有些变动(这个例子中红色标注地方),(我是从1.2.2直接更新到2.0的,期间发生过什么这里不做描述)

 

这个例子的实现,离不开优秀文章的帮助,在这里向作者表示感谢。

参考文章:

.net 使用NPOI或MyXls把DataTable导出到Excel

NPOI - Initialisation of record 0x862 left 2 bytes remaining still to be read.

 

POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写

用NPOI操作EXCEL--锁定列

 

转载于:https://www.cnblogs.com/mayixue/p/3152468.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NPOI-2.2.0.0 的.net2.0.net4.0版。(.net2.0版实测有效) (一)传统操作Excel遇到的问题: 1、如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。 2、Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。 3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。 4、Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。 (二)使用NPOI的优势 1、您可以完全免费使用该框架 2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等) 3、专业的技术支持服务(24*7全天候) (非免费) 4、支持处理的文件格式包括xls, xlsx, docx. 5、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间) 6、同时支持文件的导入导出 7、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0) 8、来自全世界大量成功且真实的测试Cases 9、大量的实例代码 11、你不需要在服务器上安装微软的Office,可以避免版权问题。 12、使用起来比Office PIA的API更加方便,更人性化。 13、你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。 14、不仅仅对与Excel可以进行操作,对于doc、ppt文件也可以做对应的操作 NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值