datatable中使用linq的条件或_asp.net中使用npoi导出excel电子表格

​NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目,可以在没有安装Office的情况下对Word或Excel文档进行读写操作。

一、添加引用

1、将NPOI.dll、Ioniz.Zip.dll复制到web/bin 文件夹中;

4b5b509a8d288e12cb91b7af2181ae20.png

2、 在common公用工具层添加引用,浏览找到NPOI.dll;

12ab84c341ec7fcc89a4bb1eabc4e59a.png

二、类库代码

在common中建立类库NPOIExcel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using NPOI.POIFS;
using NPOI.Util;
using System.IO;
using System.Data;
using System.Data.SqlClient;
   public class DataTableRenderToExcel
  {
       /// <summary>
       /// DataTable导出到Excel文件
       /// </summary>
       /// <param name="dtSource">源DataTable</param>
       /// <param name="strHeaderText">表头文本</param>
       /// <param name="strFileName">保存位置</param>
       public static void DataTableToExcel(DataTable dtSource, string strHeaderText, string strFileName)
      {
           using (MemoryStream ms = DataTableToExcel(dtSource, strHeaderText))
          {
               using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
              {
                   byte[] data = ms.ToArray();
                   fs.Write(data, 0, data.Length);
                   fs.Flush();
              }
          }
      }

       /// <summary>
       /// DataTable导出到Excel的MemoryStream
       /// </summary>
       /// <param name="dtSource">源DataTable</param>
       /// <param name="strHeaderText">表头文本</param>
       public static MemoryStream DataTableToExcel(DataTable dtSource, string strHeaderText)
      {
           HSSFWorkbook workbook = new HSSFWorkbook();
           HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
           #region 右击文件 属性信息
          {
               DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
               dsi.Company = "NPOI";
               workbook.DocumentSummaryInformation = dsi;

               SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
               si.Author = "文件作者信息"; //填加xls文件作者信息
               si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息
               si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息
               si.Comments = "作者信息"; //填加xls文件作者信息
               si.Title = "标题信息"; //填加xls文件标题信息
               si.Subject = "主题信息";//填加文件主题信息
               si.CreateDateTime = System.DateTime.Now;
               workbook.SummaryInformation = si;
          }
           #endregion

           HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();
           HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat();
           dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");

           //取得列宽
           int[] arrColWidth = new int[dtSource.Columns.Count];
           foreach (DataColumn item in dtSource.Columns)
          {
               arrColWidth[item.Ordinal] = System.Text.Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
          }
           for (int i = 0; i < dtSource.Rows.Count; i++)
          {
               for (int j = 0; j < dtSource.Columns.Count; j++)
              {
                   int intTemp = System.Text.Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
                   if (intTemp > arrColWidth[j])
                  {
                       arrColWidth[j] = intTemp;
                  }
              }
          }
           int rowIndex = 0;
           foreach (DataRow row in dtSource.Rows)
          {
               #region 新建表,填充表头,填充列头,样式
               if (rowIndex == 65535 || rowIndex == 0)
              {
                   if (rowIndex != 0)
                  {
                       sheet = (HSSFSheet)workbook.CreateSheet();
                  }

                   #region 表头及样式
                  {
                       HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);
                       headerRow.HeightInPoints = 25;
                       headerRow.CreateCell(0).SetCellValue(strHeaderText);

                       HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();

                       headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.LEFT;  //左对齐
                       HSSFFont font = (HSSFFont)workbook.CreateFont();
                       font.FontHeightInPoints = 20;
                       font.Boldweight = 700;
                       headStyle.SetFont(font);
                       headerRow.GetCell(0).CellStyle = headStyle;
                       // sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
                       //headerRow.Dispose();
                  }
                   #endregion


                   #region 列头及样式
                  {
                       HSSFRow headerRow = (HSSFRow)sheet.CreateRow(1);
                       HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
                       //headStyle.Alignment = CellHorizontalAlignment.CENTER;
                       HSSFFont font = (HSSFFont)workbook.CreateFont();
                       font.FontHeightInPoints = 10;
                       font.Boldweight = 700;
                       headStyle.SetFont(font);
                       foreach (DataColumn column in dtSource.Columns)
                      {
                           headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                           headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
                           //设置列宽
                sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
                      }
                       // headerRow.Dispose();
                  }
                   #endregion
                   rowIndex = 2;
              }
               #endregion

               #region 填充内容
               HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
               foreach (DataColumn column in dtSource.Columns)
              {
                   HSSFCell newCell = (HSSFCell)dataRow.CreateCell(column.Ordinal);
                   string drValue = row[column].ToString();
                   switch (column.DataType.ToString())
                  {
                       case "System.String"://字符串类型
                           newCell.SetCellValue(drValue);
                           break;
                       case "System.DateTime"://日期类型
                           System.DateTime dateV;
                           System.DateTime.TryParse(drValue, out dateV);
                           newCell.SetCellValue(dateV);
                           newCell.CellStyle = dateStyle;//格式化显示
                           break;
                       case "System.Boolean"://布尔型
                           bool boolV = false;
                           bool.TryParse(drValue, out boolV);
                           newCell.SetCellValue(boolV);
                           break;
                       case "System.Int16"://整型
                       case "System.Int32":
                       case "System.Int64":
                       case "System.Byte":
                           int intV = 0;
                           int.TryParse(drValue, out intV);
                           newCell.SetCellValue(intV);
                           break;
                       case "System.Decimal"://浮点型
                       case "System.Double":
                           double doubV = 0;
                           double.TryParse(drValue, out doubV);
                           newCell.SetCellValue(doubV);
                           break;
                       case "System.DBNull"://空值处理
                           newCell.SetCellValue("");
                           break;
                       default:
                           newCell.SetCellValue("");
                           break;
                  }
              }
               #endregion
               rowIndex++;
          }
           using (MemoryStream ms = new MemoryStream())
          {
               workbook.Write(ms);
               ms.Flush();
               ms.Position = 0;
               sheet.Dispose();
               //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
               return ms;
          }
      }


       /// <summary>读取excel
       /// 默认第一行为标头
       /// </summary>
       /// <param name="strFileName">excel文档路径</param>
       /// <returns></returns>
       public static DataTable Import(string strFileName)
      {
           DataTable dt = new DataTable();
           HSSFWorkbook hssfworkbook;
           using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
          {
               hssfworkbook = new HSSFWorkbook(file);
          }
           HSSFSheet sheet = (HSSFSheet)hssfworkbook.GetSheetAt(0);
           System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
           HSSFRow headerRow = (HSSFRow)sheet.GetRow(0);
           int cellCount = headerRow.LastCellNum;
           for (int j = 0; j < cellCount; j++)
          {
               HSSFCell cell = (HSSFCell)headerRow.GetCell(j);
               dt.Columns.Add(cell.ToString());
          }

           for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
          {
               HSSFRow row = (HSSFRow)sheet.GetRow(i);
               DataRow dataRow = dt.NewRow();
               for (int j = row.FirstCellNum; j < cellCount; j++)
              {
                   if (row.GetCell(j) != null)
                       dataRow[j] = row.GetCell(j).ToString();
              }

               dt.Rows.Add(dataRow);
          }
           return dt;
      }

//以上是新增的。

       public static Stream RenderDataTableToExcel(DataTable SourceTable)
      {
           HSSFWorkbook workbook = new HSSFWorkbook();
           MemoryStream ms = new MemoryStream();
           HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
           HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);

           // handling header.
           foreach (DataColumn column in SourceTable.Columns)
               headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

           // handling value.
           int rowIndex = 1;

           foreach (DataRow row in SourceTable.Rows)
          {
               HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
               foreach (DataColumn column in SourceTable.Columns)
              {
                   dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
              }

               rowIndex++;
          }

           workbook.Write(ms);
           ms.Flush();
           ms.Position = 0;
           sheet = null;
           headerRow = null;
           workbook = null;
           return ms;
      }

       public static void RenderDataTableToExcel(DataTable SourceTable, string FileName)
      {
           MemoryStream ms = RenderDataTableToExcel(SourceTable) as MemoryStream;
           FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
           byte[] data = ms.ToArray();

           fs.Write(data, 0, data.Length);
           fs.Flush();
           fs.Close();

           data = null;
           ms = null;
           fs = null;
      }
//导入excel
       public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex)
      {
           HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
           HSSFSheet sheet = (HSSFSheet)workbook.GetSheet(SheetName);
           DataTable table = new DataTable();
           HSSFRow headerRow = (HSSFRow)sheet.GetRow(HeaderRowIndex);
           int cellCount = headerRow.LastCellNum;
           for (int i = headerRow.FirstCellNum; i < cellCount; i++)
          {
               DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
               table.Columns.Add(column);
          }

           int rowCount = sheet.LastRowNum;
           for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)
          {
               HSSFRow row = (HSSFRow)sheet.GetRow(i);
               DataRow dataRow = table.NewRow();
               for (int j = row.FirstCellNum; j < cellCount; j++)
                   dataRow[j] = row.GetCell(j).ToString();
          }
           ExcelFileStream.Close();
           workbook = null;
           sheet = null;
           return table;
      }
//导入EXCEL
       public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex)
      {
           HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
           HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(SheetIndex);
           DataTable table = new DataTable();
           HSSFRow headerRow = (HSSFRow)sheet.GetRow(HeaderRowIndex);
           int cellCount = headerRow.LastCellNum;

           for (int i = headerRow.FirstCellNum; i < cellCount; i++)
          {
               DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
               table.Columns.Add(column);
          }

           int rowCount = sheet.LastRowNum;

           for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)
          {
               HSSFRow row = (HSSFRow)sheet.GetRow(i);
               DataRow dataRow = table.NewRow();

               for (int j = row.FirstCellNum; j < cellCount; j++)
              {
                   if (row.GetCell(j) != null)
                       dataRow[j] = row.GetCell(j).ToString();
              }

               table.Rows.Add(dataRow);
          }

           ExcelFileStream.Close();
           workbook = null;
           sheet = null;
           return table;
      }

       /// <summary>读取excel
       /// 默认第一行为标头
       /// </summary>
       /// <param name="path">excel文档路径</param>
       /// <returns></returns>
       public static DataTable RenderDataTableFromExcel(string path)
      {
           DataTable dt = new DataTable();
           HSSFWorkbook hssfworkbook;
           using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
          {
               hssfworkbook = new HSSFWorkbook(file);
          }
           HSSFSheet sheet = (HSSFSheet)hssfworkbook.GetSheetAt(0);
           System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
           HSSFRow headerRow = (HSSFRow)sheet.GetRow(0);
           int cellCount = headerRow.LastCellNum;
           for (int j = 0; j < cellCount; j++)
          {
               HSSFCell cell = (HSSFCell)headerRow.GetCell(j);
               dt.Columns.Add(cell.ToString());
          }

           for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
          {
               HSSFRow row = (HSSFRow)sheet.GetRow(i);
               DataRow dataRow = dt.NewRow();
               for (int j = row.FirstCellNum; j < cellCount; j++)
              {
                   if (row.GetCell(j) != null)
                       dataRow[j] = row.GetCell(j).ToString();
              }
               dt.Rows.Add(dataRow);
          }
           return dt;
      }
 
  }

三、前端代码

页面放置导出按钮;

32af3c15a9f126e1eea299308a2fc961.png
     <asp:Button ID="export" runat="server" CssClass="layui-btn layui-btn-warm" 
           Text="导出数据" onClick="export_Click" />

四、后台代码

protected void export_Click(object sender, EventArgs e)
      {
           
           DataTable dt = new DAL.banqi().GetList(GetWhere());
  //以下注释的部分是使用另一个方法      
  //MemoryStream ms = DataTableRenderToExcel.RenderDataTableToExcel(dt) as MemoryStream;
           //Response.AddHeader("Content-Disposition", string.Format("attachment; filename=" + DateTime.Now.ToString("yyyy-MM-dd_HH_mm_ss_fff") + ".xls"));
           //Response.BinaryWrite(ms.ToArray());
           //Response.ContentType = "application/ms-excel";
           //ms.Close();
           //ms.Dispose();
    //以下使用datatabletoexcel方法,参数为数据表、excel标题名,使用当日日期时间作为导出文件名
           MemoryStream ms = DataTableRenderToExcel.DataTableToExcel(dt, "班期数据导出");
           Response.AddHeader("Content-Disposition", string.Format("attachment; filename=" + DateTime.Now.ToString("yyyy-MM-dd_HH_mm_ss_fff") + ".xls"));
           Response.BinaryWrite(ms.ToArray());
           Response.ContentType = "application/ms-excel";
           ms.Close();
           ms.Dispose();    
      }

其中DAL数据访问层中GetList方法的代码如下,数据库助手类SqlHelper的代码省略:

// 组合SQL查询语句==========================
      public string CombSqlTxt(Model.Banqi banqi)
      {
           StringBuilder strTemp = new StringBuilder();          
           if (!string.IsNullOrEmpty(banqi.bqid))
          {
               strTemp.Append(" and bqid ='" +banqi.bqid + "'");
          }
           if (!string.IsNullOrEmpty(banqi.bqmc))
          {
               strTemp.Append(" and bqmc like '%" + banqi.bqmc + "%'");
          }
           if (banqi.pxks.ToString() != "0001/1/1 0:00:00" )
          {
               strTemp.Append(" and [pxks]<='" + banqi.pxks.ToString("yyyy-MM-dd") + "'");
          }
           if (banqi.pxjs.ToString() != "0001/1/1 0:00:00")
          {
               strTemp.Append(" and [pxjs]>='" + banqi.pxjs.ToString("yyyy-MM-dd") + "'");
          }
           return strTemp.ToString();
      }
//根据条件查询数据,返回dt
       public DataTable GetList(Model.Banqi banqi)
      {
           StringBuilder strSql = new StringBuilder();
           strSql.Append("select * from [peixun].[dbo].[banqi] where 1=1");
           strSql.Append(CombSqlTxt(banqi));
           return new SqlHelper().ExecuteQuery(strSql.ToString(), CommandType.Text);
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值