private static XSSFFont FindXFont(HSSFFont hSSFFont,List<XSSFFont> xSSFFonts, XSSFSheet xSSFSheet)
foreach (var item in xSSFFonts)
if (item.IsBold != hSSFFont.IsBold)
continue;
else if (item.Charset != hSSFFont.Charset)
continue;
else if (item.Color != hSSFFont.Color)
continue;
else if (item.FontHeight != hSSFFont.FontHeight)
continue;
else if (item.FontName != hSSFFont.FontName)
continue;
else if (item.IsItalic != hSSFFont.IsItalic)
continue;
else if (item.IsStrikeout != hSSFFont.IsStrikeout)
continue;
else if (item.TypeOffset != hSSFFont.TypeOffset)
continue;
else if (item.Underline != hSSFFont.Underline)
continue;
return item;
var xSSFFont = xSSFSheet.Workbook.CreateFont() as XSSFFont;
xSSFFont.IsBold = hSSFFont.IsBold;
xSSFFont.Charset = hSSFFont.Charset;
xSSFFont.Color = hSSFFont.Color;
xSSFFont.FontHeight = hSSFFont.FontHeight;
xSSFFont.FontName = hSSFFont.FontName;
xSSFFont.IsItalic = hSSFFont.IsItalic;
xSSFFont.IsStrikeout = hSSFFont.IsStrikeout;
xSSFFont.TypeOffset = hSSFFont.TypeOffset;
xSSFFont.Underline = hSSFFont.Underline;
xSSFFonts.Add(xSSFFont);
return xSSFFont;
之前在网上找的代码,转换格式花费的时间实在是不能接受(超过一分钟了),现在工作中要转换的文件大概在50份上下,转换时间不超过10s,还能接受。
前面的调用方法如下:
private void ConvertXLSToXLSX(string srcFilePath, string targetFilePath)
using (var fs = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
var oldWorkbook = WorkbookFactory.Create(fs);
if(oldWorkbook is HSSFWorkbook)
var numberOfSheets = oldWorkbook.NumberOfSheets;
if(numberOfSheets == 1)
var oldWorksheet = oldWorkbook.GetSheetAt(0) as HSSFSheet;
using (var fileStream = new FileStream(targetFilePath, FileMode.Create))
var newWorkBook = new XSSFWorkbook();
var sheet = oldWorksheet.ConvertToXSheet(newWorkBook);
newWorkBook.Add(sheet);
newWorkBook.Write(fileStream);
newWorkBook.Close();
oldWorkbook.Close();
else if(numberOfSheets > 1)
using (var fileStream = new FileStream(targetFilePath, FileMode.Create))
var newWorkBook = new XSSFWorkbook();
for (int i = 0; i < numberOfSheets; i++)
var oldWorksheet = oldWorkbook.GetSheetAt(i) as HSSFSheet;
var sheet = oldWorksheet.ConvertToXSheet(newWorkBook);
newWorkBook.Add(sheet);
newWorkBook.Write(fileStream);
newWorkBook.Close();
oldWorkbook.Close();
if(oldWorkbook is XSSFWorkbook)
if (File.Exists(targetFilePath))
File.Delete(targetFilePath);
File.Copy(srcFilePath, targetFilePath);
建议大家使用WorkbookFactory.Create(fs);
方式进行读取,并进行类型判断if(oldWorkbook is HSSFWorkbook)
和if(oldWorkbook is XSSFWorkbook)
,因为有些坑啊!表面看着是xls格式,但是读取结果是xlsx格式的,如果这样的情况,直接文件copy过去改后缀就行了!
以上就是相关代码,以供大伙参考!
NPOI是一个开源的.NET库,用于处理Microsoft Office文档,包括Word、Excel等。它支持Excel的读取、写入、格式化等操作,同时具有良好的扩展性和易用性。NPOI库由两部分组成:NPOI和NPSpreadsheet。NPOI提供了对Microsoft Office文档格式的低层次访问,而NPSpreadsheet提供了更高层次的API,用于处理Excel文件。NPOI库是一个功能强大的.NET库,用于处理Excel文件,包括导入和导出操作。
今天遇到一个问题,生产环境导出数据时,打开下载的excel提示,文件格式已坏
这是什么鬼,一看代码,导出的格式是xls(2003版,以下只写后缀名)的,使用的HXXFWorkbook
一查数据,67000多条,xls格式的文件只能写65536行,猜测是这个问题,导致导出文件有问题,然后就准备将导出的文件由xls改成xlsx(2007以上版本,该版本最多可以支持1048576行)
本以为只是简单的将HXXFWorkbook 改为XSSFWorkbook,把导出的Content-Type改一下,文件名后缀
利用NPOI组件读写XLSX文件
简介:NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。
NPOI操作Excel时分为.xls和.xlsx的操作,上篇文章讲述了.xls的操作,这篇文章将讲述.xlsx的操作
解决方案:
设计文件:
namespace XlsxViaNpoi
一、 数据导出到Excel中利用了浏览器的文件下载功能
1、 必须要在新的页面打开下载的Url 格式:window.open (‘https://www.baidu.com’);
2、 C#不支持Excel直接操作,只能使用第三方组件 有两种选择
3、 第一种:微软的msoffice 的Excel 缺点是:如果这个版本是msoffice2019其他电脑要运行的话必须和他版本一致,不然就会报错,运行的电脑也必须装有msoffice和开发者的电脑上的msoffice版本一样才能运行起来
4、 第二种
最近有朋友反馈使用NPOI向已有的xlsx文件中添加数据后,要么无法保存新增数据,要么直接报出下图所示的错误,下面就来说一下如何利用NPOI向一个已有的xlsx文件添加数据的方法。
2、实现方法
假设当前有一个xlsx文件,其数据如下图所示:
如果要向该文件添加一行新的数据,只要分三步走即可:
1、创建文件流读取xlsx
2、添加新的数据
3、创建文件流写入xlsx
using System;
using System.IO;
namespace NPOIApp
class Pr
https://blog.csdn.net/IT_xiao_guang_guang/article/details/104217491?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4
var streamWrite = new FileStream("存放路径.xlsx", FileMode.OpenOrCreate, FileAccess.Write);//调用方法AddCopy()将第一个Excel文件的sheet1复制到第二个Excel文件sheet2中去,并命名复制后的工作表。workbook2.SaveToFile("路径.xlsx");//sheet2.Name去掉就是默认。//获取工作表中sheet。//获取第一个工作表。//创建第二个工作表。
最近公司内部有个小需求,希望能够有个小工具用来解析Excel加密文件并且能够批量处理及Join多个Sheet中的表内容。本来想着蛮简单的使用NPOI读取多个Sheet中的表,然后做个筛选并且Join一下,读.xls加密文件比较简单网上搜索就找到解决方案,结果在读取.xlsx的加密文件卡住了,在GitHub上找了一圈终于解决了,记录一下以免碰到相同情况忘记了。到这里就能正常读取.xlsx文件了,还是比较简单的,只是网上好像没查到很多资料,我看了有人用Java写的示例就转成C#来记录下。
NPOI作为 POI项目的
.NET 版本,确实是能很方便的实现读写Excel,那么本文就作为科普,从头到尾实现以下通过NOPI 读写Excel吧!
首先需要下载NOPI,这里是链接,下载最新版本就行http://npoi.codeplex.com/releases
本人下载的是2.1.3版本解压打开后
进入dotnet4就能找到我