常用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;
  }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM