huyu123333333 2019-04-17 09:16 采纳率: 60%
浏览 670
已结题

C#中使用Nopi导入EXCEL表格,只是更改了一下表头,再导出时excel表格的大小变大好几倍?

比如:
导入一个130k的表格,在c#中将其转为datatable后,更改了一下表头和某些少量数据。但并未增加数据!然后再将datatable转为excel表格并导出时。新表格的大小为890k.
注意:1.检查过没有隐藏的对象。
2.表格的单元格大小前后一致。
恳请大佬帮忙解决一下:

  /// 导出Excel 
        /// </summary>
        /// <param name="SourceTable">导出的数据源</param>
        /// <param name="page">WEB页面对象,默认传Page,只可WEB后台调用</param>
        /// <param name="type">WEB页面值,如果是素金则另作处理</param>
        /// <returns></returns>
        public void ExportExcel(DataTable ds, DataTable dtt, Page page, string type)
        {
            DataTable dt = ds;
            string basePath = page.Server.MapPath(".");
            //如果目录不存在,则创建目录 
            if (!Directory.Exists(basePath))
            {
                Directory.CreateDirectory(basePath);
            }
            string filePath = string.Empty;
            string fileName = string.Empty;

            //filePath = page.Server.MapPath(".") + "\\" + fileName + ".xls";

            // filePath = page.Server.MapPath(".") + "\\" + System.DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";


            MemoryStream ms;
            if (type == "素金")
            {
                fileName = System.DateTime.Now.ToString("yyyyMMddHHmmss");
                ms = RenderDataTableToExcelSujin(dt, page) as MemoryStream;
            }
            else
            {
                if (ds.Rows.Count > 0)
                {
                    if (ds.Rows[0]["采购订单号"].ToString().Trim().Length != 0)
                    {
                        fileName = ds.Rows[0]["采购订单号"].ToString().Trim();
                    }
                    else
                    {
                        fileName = System.DateTime.Now.ToString("yyyyMMddHHmmss");
                    }
                }
                else
                {
                    fileName = System.DateTime.Now.ToString("yyyyMMddHHmmss");
                }
                ms = RenderDataTableToExcel(dt, dtt, page) as MemoryStream;
            }

            FileStream fs;
            //FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
            try
            {
                filePath = page.Server.MapPath(".") + "\\" + fileName + ".xls";
                fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);

            }
            catch (Exception)
            {

                fileName = System.DateTime.Now.ToString("yyyyMMddHHmmss");
                filePath = page.Server.MapPath(".") + "\\" + fileName + ".xls";
                fs = new FileStream(page.Server.MapPath(".") + "\\" + fileName + ".xls", FileMode.Create, FileAccess.Write);
            }
            byte[] data = ms.ToArray();
            fs.Write(data, 0, data.Length);
            fs.Flush();
            fs.Close();
            data = null;
            ms = null;
            fs = null;
            page.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            page.Response.HeaderEncoding = System.Text.Encoding.GetEncoding("GB2312");
            page.Response.AppendHeader("content-disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xls");
            page.Response.ContentType = "Application/excel";
            if (page.Response.IsClientConnected)
            {
                page.Response.WriteFile(filePath);
                page.Response.Flush();
            }
            //Response.WriteFile(filePath);
            //Response.Flush();
            try
            {
                //删除导出的服务器文件
                File.Delete(filePath);
            }
            catch (Exception)
            {
            }
            page.Response.Clear();
        }

                 private Stream RenderDataTableToExcelSujin(DataTable SourceTable, Page page)
        {
            MemoryStream ms = new MemoryStream();
            HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet();
            //加标题  
            IRow headerRow2 = sheet.CreateRow(0);
            headerRow2.Height = 500;

            //加了两行空行
            IRow dataRow1 = sheet.CreateRow(1);
            //列高2000
            dataRow1.Height = 500;
            dataRow1.Sheet.SetColumnWidth(0, 50 * 60);
            dataRow1.Sheet.SetColumnWidth(1, 50 * 60);
            dataRow1.Sheet.SetColumnWidth(2, 50 * 60);
            dataRow1.Sheet.SetColumnWidth(3, 50 * 95);

            IRow dataRow2 = sheet.CreateRow(2);
            //列高2000
            dataRow2.Height = 500;
            dataRow2.Sheet.SetColumnWidth(0, 50 * 60);
            dataRow2.Sheet.SetColumnWidth(1, 50 * 60);
            dataRow2.Sheet.SetColumnWidth(2, 50 * 60);
            dataRow2.Sheet.SetColumnWidth(3, 50 * 95);


            //添加Excel的表头
            for (int i = 0; i < SourceTable.Columns.Count; i++)
            {
                headerRow2.CreateCell(i).SetCellValue(SourceTable.Columns[i].ColumnName);
            }
            int rowIndex = 3;
            Regex regExp = new Regex(@"^(-?\d+)(\.\d+)?$");
            List<string> lstColumnname = new List<string>();
            foreach (DataColumn item in SourceTable.Columns)
            {
                for (int i = 0; i < SourceTable.Rows.Count; i++)
                {
                    if (SourceTable.Rows[i][item.ColumnName].ToString().Trim().Length > 0)
                    {
                        if (!regExp.IsMatch(SourceTable.Rows[i][item.ColumnName].ToString().Trim()))
                        {
                            lstColumnname.Add(item.ColumnName);
                            break;
                        }
                    }
                }
            }
            foreach (DataRow row in SourceTable.Rows)
            {
                IRow dataRow = sheet.CreateRow(rowIndex);
                //列高2000
                dataRow.Height = 500;
                dataRow.Sheet.SetColumnWidth(0, 50 * 60);
                dataRow.Sheet.SetColumnWidth(1, 50 * 60);
                dataRow.Sheet.SetColumnWidth(2, 50 * 60);
                dataRow.Sheet.SetColumnWidth(3, 50 * 95);
                ////素金特殊要求:除表头从第三行开始绑定
                //if (rowIndex <= 2)
                //{
                //    rowIndex++;
                //    continue;
                //}
                for (int i = 0; i < SourceTable.Columns.Count; i++)
                {
                    try
                    {
                        if (row[i].ToString().Trim().Length != 0)
                        {
                            if (lstColumnname.Contains(SourceTable.Columns[i].ColumnName))
                                dataRow.CreateCell(i).SetCellValue(@row[i].ToString());
                            else
                            {
                                string aaa = SourceTable.Columns[i].ColumnName;
                                if (row[i].ToString().Contains("."))
                                {
                                    //有小数 转double
                                    dataRow.CreateCell(i).SetCellValue(@Convert.ToDouble((row[i].ToString() == "" ? "0" : row[i].ToString())));
                                }
                                else
                                {
                                    //无小数 转int
                                    dataRow.CreateCell(i).SetCellValue(@Convert.ToInt32(row[i].ToString()));
                                }
                            }
                        }
                        else dataRow.CreateCell(i).SetCellValue(@row[i].ToString());
                    }
                    catch (Exception)
                    {
                        dataRow.CreateCell(i).SetCellValue(@row[i].ToString());
                    }
                }
                rowIndex++;
            }
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            sheet = null;
            headerRow2 = null;
            workbook = null;
            return ms;
        }
  • 写回答

1条回答 默认 最新

  • dl198708 2019-04-17 09:30
    关注

    FileStream fs = new FileStream(“demo.xls”, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);//读取流

    POIFSFileSystem ps=new POIFSFileSystem(fs);//需using NPOI.POIFS.FileSystem;
    IWorkbook workbook = new HSSFWorkbook(ps);
    ISheet sheet = workbook.GetSheetAt(0);//获取工作表
    IRow row = sheet.GetRow(0); //得到表头
    FileStream fout = new FileStream(“demo.xls”, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);//写入流
    row = sheet.CreateRow((sheet.LastRowNum + 1));//在工作表中添加一行

    ICell cell1 = row.CreateCell(0);
    cell1.SetCellValue(“测试数据”);//赋值

    fout.Flush();
    workbook.Write(fout);//写入文件
    workbook = null;
    fout.Close();

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!