前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用Excel导出方法

常用Excel导出方法

作者头像
_一级菜鸟
发布2020-04-08 18:13:14
6850
发布2020-04-08 18:13:14
举报
文章被收录于专栏:工厂程序员工厂程序员

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

  用wps打开看着格式没问题

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

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

1.文件流的方式

代码语言:javascript
复制
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

代码语言:javascript
复制
  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。

代码语言:javascript
复制
  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;
  }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档