NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中
由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案。
注意:若直接使用在WinForm项目中,必需先下载并在项目中引用NPOI2.0或以上版本的组件才可以正常使用。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
- using System.Data;
- using System.Windows.Forms;
- using NPOI.SS.UserModel;
- using NPOI.HSSF.UserModel;
- using NPOI.XSSF.UserModel;
- using Zwj.TEMS.Common;
- namespace TEMS.Service
- {
- public static class ExcelHelperForCs
- {
- #region 私有方法
- /// <summary>
- /// 获取要保存的文件名称(含完整路径)
- /// </summary>
- /// <returns></returns>
- private static string GetSaveFilePath()
- {
- SaveFileDialog saveFileDig = new SaveFileDialog();
- saveFileDig.Filter = "Excel Office97-2003(*.xls)|.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";
- saveFileDig.FilterIndex = ;
- saveFileDig.OverwritePrompt = true;
- saveFileDig.InitialDirectory = Common.DesktopDirectory;
- string filePath = null;
- if (saveFileDig.ShowDialog() == DialogResult.OK)
- {
- filePath = saveFileDig.FileName;
- }
- return filePath;
- }
- /// <summary>
- /// 判断是否为兼容模式
- /// </summary>
- /// <param name="filePath"></param>
- /// <returns></returns>
- private static bool GetIsCompatible(string filePath)
- {
- return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase);
- }
- /// <summary>
- /// 创建工作薄
- /// </summary>
- /// <param name="isCompatible"></param>
- /// <returns></returns>
- private static IWorkbook CreateWorkbook(bool isCompatible)
- {
- if (isCompatible)
- {
- return new HSSFWorkbook();
- }
- else
- {
- return new XSSFWorkbook();
- }
- }
- /// <summary>
- /// 创建工作薄(依据文件流)
- /// </summary>
- /// <param name="isCompatible"></param>
- /// <param name="stream"></param>
- /// <returns></returns>
- private static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream)
- {
- if (isCompatible)
- {
- return new HSSFWorkbook(stream);
- }
- else
- {
- return new XSSFWorkbook(stream);
- }
- }
- /// <summary>
- /// 创建表格头单元格
- /// </summary>
- /// <param name="sheet"></param>
- /// <returns></returns>
- private static ICellStyle GetCellStyle(IWorkbook workbook)
- {
- ICellStyle style = workbook.CreateCellStyle();
- style.FillPattern = FillPattern.SolidForeground;
- style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
- return style;
- }
- /// <summary>
- /// 从工作表中生成DataTable
- /// </summary>
- /// <param name="sheet"></param>
- /// <param name="headerRowIndex"></param>
- /// <returns></returns>
- private static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex)
- {
- DataTable table = new DataTable();
- IRow headerRow = sheet.GetRow(headerRowIndex);
- int cellCount = headerRow.LastCellNum;
- for (int i = headerRow.FirstCellNum; i < cellCount; i++)
- {
- if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
- {
- // 如果遇到第一个空列,则不再继续向后读取
- cellCount = i + ;
- break;
- }
- DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
- table.Columns.Add(column);
- }
- for (int i = (headerRowIndex + ); i <= sheet.LastRowNum; i++)
- {
- IRow row = sheet.GetRow(i);
- if (row != null && !string.IsNullOrEmpty(row.Cells[].StringCellValue))
- {
- 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);
- }
- }
- return table;
- }
- #endregion
- #region 公共导出方法
- /// <summary>
- /// 由DataSet导出Excel
- /// </summary>
- /// <param name="sourceTable">要导出数据的DataTable</param>
- /// <returns>Excel工作表</returns>
- public static string ExportToExcel(DataSet sourceDs, string filePath = null)
- {
- if (string.IsNullOrEmpty(filePath))
- {
- filePath = GetSaveFilePath();
- }
- if (string.IsNullOrEmpty(filePath)) return null;
- bool isCompatible = GetIsCompatible(filePath);
- IWorkbook workbook = CreateWorkbook(isCompatible);
- ICellStyle cellStyle = GetCellStyle(workbook);
- for (int i = ; i < sourceDs.Tables.Count; i++)
- {
- DataTable table = sourceDs.Tables[i];
- string sheetName = "result" + i.ToString();
- ISheet sheet = workbook.CreateSheet(sheetName);
- IRow headerRow = sheet.CreateRow();
- // handling header.
- foreach (DataColumn column in table.Columns)
- {
- ICell cell = headerRow.CreateCell(column.Ordinal);
- cell.SetCellValue(column.ColumnName);
- cell.CellStyle = cellStyle;
- }
- // handling value.
- int rowIndex = ;
- foreach (DataRow row in table.Rows)
- {
- IRow dataRow = sheet.CreateRow(rowIndex);
- foreach (DataColumn column in table.Columns)
- {
- dataRow.CreateCell(column.Ordinal).SetCellValue((row[column] ?? "").ToString());
- }
- rowIndex++;
- }
- }
- FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
- workbook.Write(fs);
- fs.Dispose();
- workbook = null;
- return filePath;
- }
- /// <summary>
- /// 由DataTable导出Excel
- /// </summary>
- /// <param name="sourceTable">要导出数据的DataTable</param>
- /// <returns>Excel工作表</returns>
- public static string ExportToExcel(DataTable sourceTable, string sheetName = "result", string filePath = null)
- {
- if (sourceTable.Rows.Count <= ) return null;
- if (string.IsNullOrEmpty(filePath))
- {
- filePath = GetSaveFilePath();
- }
- if (string.IsNullOrEmpty(filePath)) return null;
- bool isCompatible = GetIsCompatible(filePath);
- IWorkbook workbook = CreateWorkbook(isCompatible);
- ICellStyle cellStyle = GetCellStyle(workbook);
- ISheet sheet = workbook.CreateSheet(sheetName);
- IRow headerRow = sheet.CreateRow();
- // handling header.
- foreach (DataColumn column in sourceTable.Columns)
- {
- ICell headerCell = headerRow.CreateCell(column.Ordinal);
- headerCell.SetCellValue(column.ColumnName);
- headerCell.CellStyle = cellStyle;
- }
- // handling value.
- int rowIndex = ;
- foreach (DataRow row in sourceTable.Rows)
- {
- IRow dataRow = sheet.CreateRow(rowIndex);
- foreach (DataColumn column in sourceTable.Columns)
- {
- dataRow.CreateCell(column.Ordinal).SetCellValue((row[column]??"").ToString());
- }
- rowIndex++;
- }
- FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
- workbook.Write(fs);
- fs.Dispose();
- sheet = null;
- headerRow = null;
- workbook = null;
- return filePath;
- }
- /// <summary>
- /// 由List导出Excel
- /// </summary>
- /// <typeparam name="T">类型</typeparam>
- /// <param name="data">在导出的List</param>
- /// <param name="sheetName">sheet名称</param>
- /// <returns></returns>
- public static string ExportToExcel<T>(List<T> data, IList<KeyValuePair<string, string>> headerNameList, string sheetName = "result", string filePath = null) where T : class
- {
- if (data.Count <= ) return null;
- if (string.IsNullOrEmpty(filePath))
- {
- filePath = GetSaveFilePath();
- }
- if (string.IsNullOrEmpty(filePath)) return null;
- bool isCompatible = GetIsCompatible(filePath);
- IWorkbook workbook = CreateWorkbook(isCompatible);
- ICellStyle cellStyle = GetCellStyle(workbook);
- ISheet sheet = workbook.CreateSheet(sheetName);
- IRow headerRow = sheet.CreateRow();
- for (int i = ; i < headerNameList.Count; i++)
- {
- ICell cell = headerRow.CreateCell(i);
- cell.SetCellValue(headerNameList[i].Value);
- cell.CellStyle = cellStyle;
- }
- Type t = typeof(T);
- int rowIndex = ;
- foreach (T item in data)
- {
- IRow dataRow = sheet.CreateRow(rowIndex);
- for (int n = ; n < headerNameList.Count; n++)
- {
- object pValue = t.GetProperty(headerNameList[n].Key).GetValue(item, null);
- dataRow.CreateCell(n).SetCellValue((pValue ?? "").ToString());
- }
- rowIndex++;
- }
- FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
- workbook.Write(fs);
- fs.Dispose();
- sheet = null;
- headerRow = null;
- workbook = null;
- return filePath;
- }
- /// <summary>
- /// 由DataGridView导出
- /// </summary>
- /// <param name="grid"></param>
- /// <param name="sheetName"></param>
- /// <param name="filePath"></param>
- /// <returns></returns>
- public static string ExportToExcel(DataGridView grid, string sheetName = "result", string filePath = null)
- {
- if (grid.Rows.Count <= ) return null;
- if (string.IsNullOrEmpty(filePath))
- {
- filePath = GetSaveFilePath();
- }
- if (string.IsNullOrEmpty(filePath)) return null;
- bool isCompatible = GetIsCompatible(filePath);
- IWorkbook workbook = CreateWorkbook(isCompatible);
- ICellStyle cellStyle = GetCellStyle(workbook);
- ISheet sheet = workbook.CreateSheet(sheetName);
- IRow headerRow = sheet.CreateRow();
- for (int i = ; i < grid.Columns.Count; i++)
- {
- ICell cell = headerRow.CreateCell(i);
- cell.SetCellValue(grid.Columns[i].Name);
- cell.CellStyle = cellStyle;
- }
- int rowIndex = ;
- foreach (DataGridViewRow row in grid.Rows)
- {
- IRow dataRow = sheet.CreateRow(rowIndex);
- for (int n = ; n < grid.Columns.Count; n++)
- {
- dataRow.CreateCell(n).SetCellValue((row.Cells[n].Value ?? "").ToString());
- }
- rowIndex++;
- }
- FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
- workbook.Write(fs);
- fs.Dispose();
- sheet = null;
- headerRow = null;
- workbook = null;
- return filePath;
- }
- #endregion
- #region 公共导入方法
- /// <summary>
- /// 由Excel导入DataTable
- /// </summary>
- /// <param name="excelFileStream">Excel文件流</param>
- /// <param name="sheetName">Excel工作表名称</param>
- /// <param name="headerRowIndex">Excel表头行索引</param>
- /// <param name="isCompatible">是否为兼容模式</param>
- /// <returns>DataTable</returns>
- public static DataTable ImportFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex, bool isCompatible)
- {
- IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
- ISheet sheet = null;
- int sheetIndex = -;
- if (int.TryParse(sheetName, out sheetIndex))
- {
- sheet = workbook.GetSheetAt(sheetIndex);
- }
- else
- {
- sheet = workbook.GetSheet(sheetName);
- }
- DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
- excelFileStream.Close();
- workbook = null;
- sheet = null;
- return table;
- }
- /// <summary>
- /// 由Excel导入DataTable
- /// </summary>
- /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
- /// <param name="sheetName">Excel工作表名称</param>
- /// <param name="headerRowIndex">Excel表头行索引</param>
- /// <returns>DataTable</returns>
- public static DataTable ImportFromExcel(string excelFilePath, string sheetName, int headerRowIndex)
- {
- using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
- {
- bool isCompatible = GetIsCompatible(excelFilePath);
- return ImportFromExcel(stream, sheetName, headerRowIndex, isCompatible);
- }
- }
- /// <summary>
- /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
- /// </summary>
- /// <param name="excelFileStream">Excel文件流</param>
- /// <param name="headerRowIndex">Excel表头行索引</param>
- /// <param name="isCompatible">是否为兼容模式</param>
- /// <returns>DataSet</returns>
- public static DataSet ImportFromExcel(Stream excelFileStream, int headerRowIndex, bool isCompatible)
- {
- DataSet ds = new DataSet();
- IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
- for (int i = ; i < workbook.NumberOfSheets; i++)
- {
- ISheet sheet = workbook.GetSheetAt(i);
- DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
- ds.Tables.Add(table);
- }
- excelFileStream.Close();
- workbook = null;
- return ds;
- }
- /// <summary>
- /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
- /// </summary>
- /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
- /// <param name="headerRowIndex">Excel表头行索引</param>
- /// <returns>DataSet</returns>
- public static DataSet ImportFromExcel(string excelFilePath, int headerRowIndex)
- {
- using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
- {
- bool isCompatible = GetIsCompatible(excelFilePath);
- return ImportFromExcel(stream, headerRowIndex, isCompatible);
- }
- }
- #endregion
- #region 公共转换方法
- /// <summary>
- /// 将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B...
- /// </summary>
- /// <param name="index">列索引</param>
- /// <returns>列名,如第0列为A,第1列为B...</returns>
- public static string ConvertColumnIndexToColumnName(int index)
- {
- index = index + ;
- int system = ;
- char[] digArray = new char[];
- int i = ;
- while (index > )
- {
- int mod = index % system;
- if (mod == ) mod = system;
- digArray[i++] = (char)(mod - + 'A');
- index = (index - ) / ;
- }
- StringBuilder sb = new StringBuilder(i);
- for (int j = i - ; j >= ; j--)
- {
- sb.Append(digArray[j]);
- }
- return sb.ToString();
- }
- /// <summary>
- /// 转化日期
- /// </summary>
- /// <param name="date">日期</param>
- /// <returns></returns>
- public static DateTime ConvertDate(object date)
- {
- string dtStr = (date ?? "").ToString();
- DateTime dt = new DateTime();
- if (DateTime.TryParse(dtStr, out dt))
- {
- return dt;
- }
- try
- {
- string spStr = "";
- if (dtStr.Contains("-"))
- {
- spStr = "-";
- }
- else if (dtStr.Contains("/"))
- {
- spStr = "/";
- }
- string[] time = dtStr.Split(spStr.ToCharArray());
- int year = Convert.ToInt32(time[]);
- int month = Convert.ToInt32(time[]);
- int day = Convert.ToInt32(time[]);
- string years = Convert.ToString(year);
- string months = Convert.ToString(month);
- string days = Convert.ToString(day);
- if (months.Length == )
- {
- dt = Convert.ToDateTime(date);
- }
- else
- {
- string rq = "";
- if (years.Length == )
- {
- years = "" + years;
- }
- if (months.Length == )
- {
- months = "" + months;
- }
- if (days.Length == )
- {
- days = "" + days;
- }
- rq = "" + years + "-" + months + "-" + days;
- dt = Convert.ToDateTime(rq);
- }
- }
- catch
- {
- throw new Exception("日期格式不正确,转换日期失败!");
- }
- return dt;
- }
- /// <summary>
- /// 转化数字
- /// </summary>
- /// <param name="d">数字字符串</param>
- /// <returns></returns>
- public static decimal ConvertDecimal(object d)
- {
- string dStr = (d ?? "").ToString();
- decimal result = ;
- if (decimal.TryParse(dStr, out result))
- {
- return result;
- }
- else
- {
- throw new Exception("数字格式不正确,转换数字失败!");
- }
- }
- #endregion
- }
- }
原文:https://www.cnblogs.com/jimcsharp/p/6634530.html
NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中的更多相关文章
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- NPOI导入导出Excel工具类
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Ref ...
- NPOI导入导出Excel
.net mvc利用NPOI导入导出excel 注意:如何导出的提交方式ajax导出是失效的! 解决方案是:js处理l两个表单的提交 代码: 第一步. 在页面里面加入2个隐藏的iframe, 如下 ...
- .Net core NPOI导入导出Excel
最近在想.net core NPOI 导入导出Excel,一开始感觉挺简单的,后来真的遇到很多坑.所以还是写一篇博客让其他人少走一些弯路,也方便忘记了再重温一遍.好了,多的不说,直接开始吧. 在.Ne ...
- 导入导出Excel工具类ExcelUtil
前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...
- NPOI MVC 模型导出Excel通用类
通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...
- Npoi导入导出Excel操作
之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...
- NPOI 导入导出excel 支持 03 07
因为微软的office成本太高了,所以开发项目的时候电脑上没安装office,而是安装了wps.但开发语言用的是C#,所以直接调用微软的office组件是很方便的,但一方面慢,一方面成本高,所以从网上 ...
随机推荐
- 20165215 学习基础和c语言基础调查
学习基础和c语言基础调查 <做中学>读后感与技能学习心得 读后感 Don't watch the clock. Do what it does. Keep going. 不要只看时钟,要效 ...
- Linux基础命令---修改用户信息usermod
usermod 修改用户的信息,包括用户名.密码.家目录.uid等. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 use ...
- qq网吧弹框如何去掉?如何删掉NetBar文件夹?
qq网吧弹框如何去掉?如何删掉NetBar文件夹?有些qq会弹出qq网吧,让人烦恼.而且点了那个不是网吧的反馈了多次都还会弹出.如何退出关闭删除取消去掉qq网吧呢,下面介绍一种解决方法:1.打开qq安 ...
- SharePoint入门——创建一个网站
1.首先安装SP相关环境,可以百度到具体操作步骤: (以下步骤基于本人环境:本人用的Win10自带的Hyper-V虚拟机.Windows Server2012R2.SQL2014以及SharePoin ...
- ES6知识整理(5)--对象的扩展
个人开这个公众号的初心是为了积累知识,因此并没有做什么推广,再说自己也不知道怎么推广,推广之后又能干些什么.已经将近10天没发文章了,虽然每天都加班,但也不会一点时间都没有,有时还是会懒癌发作不想学习 ...
- SRTP参数及数据包处理过程(转)
源: SRTP参数及数据包处理过程
- Docker学习笔记之在开发环境中使用服务发现
0x00 概述 服务发现应用是很多服务化系统的组成部分,所以在开发.测试环境中也就有必要配备一套服务发现体系来配合我们的开发.测试工作.在这一小节里,我们就来谈谈如何在 Docker 环境下部署服务发 ...
- metasploit(MSF)对windows的ms17-010漏洞利用
picture 配置exploit msf > use exploit/windows/smb/ms17_010_eternalblue msf exploit(windows/smb/ms17 ...
- day24,25组合 封装 多态
面向对象的精髓:将数据和处理数据的代码绑定成一个对象 只要获取到对象相应的数据和方法都有了 一.组合 什么叫组合? 多个对象放在一起叫组合 组合的作用也是降低代码的冗余 # 学生会增加各种各样的新的属 ...
- topcoder srm 495 div1
problem1 link 从前向后确定一下,然后再从后向前确定一下.一样的话就是可以确定的. problem2 link 首先将强连通分量缩点.理论上来说,只需要遍历所有入度为0的联通块中的一个即可 ...