专栏首页工厂程序员常用Excel导出方法

常用Excel导出方法

  最近项目中用到导出Excel,项目已有的方法1和2,导出的excel,看似是exce格式,其实只是改了后缀名。

  用wps打开看着格式没问题

  实际另存为的时候格式显示是txt

于是找到了改为NPOI,导出的Excel格式正常。

1.文件流的方式

public static string DataToExcel(Page page, string s_FileName, DataTable m_DataTable)
 {
            string FileName = page.Server.MapPath("/"+ s_FileName+".xls"); //文件存放路径  
          
            if (System.IO.File.Exists(FileName))   //存在则删除  
            {
                System.IO.File.Delete(FileName);
            }
            System.IO.FileStream objFileStream;
            System.IO.StreamWriter objStreamWriter;
            string strLine = "";
            objFileStream = new System.IO.FileStream(FileName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
            objStreamWriter = new System.IO.StreamWriter(objFileStream, Encoding.Unicode);
           // objStreamWriter.
            for (int i = 0; i < m_DataTable.Columns.Count; i++)
            {
                strLine = strLine + m_DataTable.Columns[i].Caption.ToString() + Convert.ToChar(9);      //写列标题  
            }
            objStreamWriter.WriteLine(strLine);
            strLine = "";
            for (int i = 0; i < m_DataTable.Rows.Count; i++)
            {
                for (int j = 0; j < m_DataTable.Columns.Count; j++)
                {
                    if (m_DataTable.Rows[i].ItemArray[j] == null)
                        strLine = strLine + " " + Convert.ToChar(9);                                    //写内容  
                    else
                    {
                        string rowstr = "";
                        rowstr = m_DataTable.Rows[i].ItemArray[j].ToString();
                        if (rowstr.IndexOf("\r\n") > 0)
                            rowstr = rowstr.Replace("\r\n", " ");
                        if (rowstr.IndexOf("\t") > 0)
                            rowstr = rowstr.Replace("\t", " ");
                        strLine = strLine + rowstr + Convert.ToChar(9);
                    }
                }
                objStreamWriter.WriteLine(strLine);
               
                strLine = "";
            }
            objStreamWriter.Close();
            objFileStream.Close();
            return FileName;        //返回生成文件的绝对路径  
 }

2.Response方式导出Excel

  public static void ExportExcelByDataTable(Page page, string strReportName, DataTable dtReport)
  {
            try
            {
                string strFileName = string.Format("attachment;filename={1}.xls", page.Server.UrlEncode(strReportName),
                    page.Server.UrlEncode(DateTime.Now.ToString("yyyyMMddHHmmss")));
                page.Response.Clear();
                page.Response.Buffer = true;
                page.Response.Charset = "GB2312";
                page.Response.AppendHeader("Content-Disposition", strFileName);
                page.Response.ContentEncoding = Encoding.GetEncoding("GB2312");
                page.Response.ContentType = "application/ms-excel";
                StringBuilder stringBuilder = new StringBuilder();
                string strt = "";
                for (int m_ColumnsCount = 0; m_ColumnsCount < dtReport.Columns.Count; m_ColumnsCount++)
                {
                    stringBuilder.Append(strt);
                    stringBuilder.Append(dtReport.Columns[m_ColumnsCount].ColumnName);
                    strt = "\t";
                }
                stringBuilder.Append('\n');
                for (int rowCount = 0; rowCount < dtReport.Rows.Count; rowCount++)
                {
                    strt = "";
                    for (int rowColumnsCount = 0; rowColumnsCount < dtReport.Columns.Count; rowColumnsCount++)
                    {
                        stringBuilder.Append(strt);
                        stringBuilder.Append(dtReport.Rows[rowCount][dtReport.Columns[rowColumnsCount].ColumnName].ToString().Replace("\n", "").Replace("\r", ""));
                        strt = "\t";
                    }
                    stringBuilder.Append('\n');
                }
                page.Response.Write(stringBuilder.ToString());
                page.Response.End();
            }
            catch (Exception error)
            {
                throw new Exception(error.Message);
            }
 }

3.使用NPOI

 需要引入第三方DLL,NPOI.dll和NPOI.OOXML.dll。

  public static void ExportExcel(Page page, string strReportName, DataTable dtReport)
   {
            //HttpContext curContext = HttpContext.Current;
            //设置编码及附件格式
            page.Response.ContentType = "application/vnd.ms-excel";
            page.Response.ContentEncoding = Encoding.UTF8;
            page.Response.Charset = "";
            string fullName = HttpUtility.UrlEncode(strReportName+".xls", Encoding.UTF8);
            page.Response.AppendHeader("Content-Disposition",
                "attachment;filename=" + HttpUtility.UrlEncode(fullName, Encoding.UTF8));  //attachment后面是分号
            byte[] data = TableToExcel(dtReport, fullName).GetBuffer();
            page.Response.BinaryWrite(TableToExcel(dtReport, fullName).GetBuffer());
            page.Response.End();
        }

        public static MemoryStream TableToExcel(DataTable dt, string file)
        {
            //创建workbook
            IWorkbook workbook;
            string fileExt = Path.GetExtension(file).ToLower();
            if (fileExt == ".xlsx")
                workbook = new XSSFWorkbook();
            else if (fileExt == ".xls")
                workbook = new HSSFWorkbook();
            else
                workbook = null;
            //创建sheet
            ISheet sheet = workbook.CreateSheet("Sheet1");

            //表头
            IRow headrow = sheet.CreateRow(0);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                ICell headcell = headrow.CreateCell(i);
                headcell.SetCellValue(dt.Columns[i].ColumnName);
            }
            //表内数据
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row = sheet.CreateRow(i + 1);
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    ICell cell = row.CreateCell(j);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                }
            }

            //转化为字节数组
            MemoryStream ms = new MemoryStream();
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            return ms;
  }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 开发注意事项

      能通过参数表或者配置文件实现的尽可能不要去写Hard Code,可减少后面代码的修改。

    _一级菜鸟
  • Teamviewer显示“未就绪,请检查您的连接”解决办法

      打开TeamViewer一直提示“未就绪,请检查您的连接”,一直会弹出一个框提示检查网路设置什么。

    _一级菜鸟
  • 肯定会用且好用的工具

      网上很多资料分享都是使用百度网盘,但是比较恶心的是,百度网盘下载限速。一款好用的软件叫PanDownload,这个软件是完全免费的,所以网上可以直接下载该软...

    _一级菜鸟
  • 中国研发首个神经网络处理器

    大数据文摘
  • Django自定义分页

    py3study
  • CRM之分页

      分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示。

    py3study
  • 13.Django基础之django分页

      我们使用脚本批量创建一些测试数据(将下面的代码保存到bulk_create.py文件中放到Django项目的根目录,直接执行即可。):

    changxin7
  • optimize 回收表空间的一些说明

    线上服务器,有张大表需要用pt-archiver根据时间划分归档大量数据到另一个新表中。原先200G的表,在归档完成后,du -hs 显示依然是200G的大小,...

    二狗不要跑
  • django 分页

    https://www.jianshu.com/p/77a8ea421e22 https://blog.csdn.net/weixin_42134789/ar...

    晴天Online
  • Linux内核最新的连续内存分配器(CMA)——避免预留大块内存【转】

    在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先...

    233333

扫码关注云+社区

领取腾讯云代金券