常用Excel导出方法

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

  用wps打开看着格式没问题

 

常用Excel导出方法_第1张图片

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

常用Excel导出方法_第2张图片

 

 于是找到了改为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;
  }

 

 

你可能感兴趣的:(常用Excel导出方法)