ASP.NET WebApi 服务端导出数据到Excel

ASP.NET服务器端导出数据到Excel

在web项目使用过html的拼接成table表格的形式导出数据到excel,但是导出execl表格不能直接修改和保存,存在数据丢失的情况,采用这种文件流的形式就不会出现excel表不能修改的情况了。

  • 解决方案中需要引用的类库如下:
  • ICSharpCode.SharpZipLib.dll
  • NPOI.dll
  • NPOI.OOXML.dll
  • NPOI.OpenXml4Net.dll
  • NPOI.OpenXmlFormats.dll
  • NPOI.XML
    也就是通过引用NPOI插件,服务器端实现导出数据到Excel。
    插件下载地址:
    http://download.csdn.net/download/realjh/10108407

项目中用到的代码实现例如:

        /// 导出数据到excel
        /// 
        /// 
        /// 
        /// 
        public static void DataTableExcel(DataTable dataTable, string fileName, string sheetName)
        {
            //创建EXCEL工作薄
            IWorkbook workBook = new XSSFWorkbook();
            //创建sheet文件表
            ISheet sheet = workBook.CreateSheet(sheetName);
            #region 创建Excel表头
            //创建表头
            IRow header = sheet.CreateRow(0);
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                //给表创建列单元格并填充列名称,此处只做首行列Columns创建和填充
                ICell cell = header.CreateCell(i);
                cell.SetCellValue(SetColumnName(dataTable.Columns[i].ColumnName));
            }
            #endregion
            #region 填充Excel单元格中的数据
            //给工作薄中非表头填充数据,遍历行数据并进行创建和填充表格
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                IRow row = sheet.CreateRow(i + 1);//表示从整张数据表的第二行开始创建并填充数据,第一行已经创建。
                for (int j = 0; j < dataTable.Columns.Count; j++)//遍历并创建每个单元格cell,将行数据填充在创建的单元格中。
                {
                    //将数据读到cell单元格中
                    ICell cell = row.CreateCell(j);
                    cell.SetCellValue(dataTable.Rows[i][j].ToString());//对数据为null的情况进行处理
                }
            }
            #endregion
            #region 工作流创建Excel文件
            //工作流写入,通过流的方式进行创建生成文件
            MemoryStream stream = new MemoryStream();
            workBook.Write(stream);
            byte[] buffer = stream.ToArray();
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
            {
                try
                {
                    fs.Write(buffer, 0, buffer.Length);
                    fs.Flush();
                }
                catch
                {
                    //异常不做任何处理,好处是让客户感觉没有问题,缺点是不利于查找程序的问题,需要日志文件跟踪。
                }
                finally
                {
                    fs.Dispose();//出现异常时,手动释放fs写对象
                    stream.Dispose();//出现异常时,手动释放stream流对象,防止卡死的现象
                }
            }
            #endregion
        }
        /// 
        /// 辅助方法拼接列名,当然这个列名称可以直接在sql语句中采用column as "中文列名称"即可
        /// 
        /// 
        /// 
        private static string SetColumnName(string name)
        {
            string columnName = string.Empty;
            #region 匹配列名称
            switch (name)
            {
                case "YUANQU":
                    columnName = "院区";
                    break;
                case "HISCODE":
                    columnName = "院区编号";
                    break;
                case "DEPT_NAME":
                    columnName = "科室名称";
                    break;
                case "USER_ID":
                    columnName = "员工工号";
                    break;
                case "USER_NAME":
                    columnName = "员工姓名";
                    break;
                case "LX_NAME":
                    columnName = "类型";
                    break;
                case "AVESCORE":
                    columnName = "平均成绩";
                    break;
                case "SCORE":
                    columnName = "综合表现";
                    break;
                case "TB_DATE":
                    columnName = "评价日期";
                    break;
                case "KHJG":
                    columnName = "评价标准";
                    break;
                case "PJLB_NAME":
                    columnName = "评价类型";
                    break;
            }
            #endregion
            return columnName;
        }

你可能感兴趣的:(ASP.NET,Web,API)