aardio调用NPOI操作excel文件
NPOI是由c#编写的开源excel / word / PPT 操作类库, 并可以同时兼容xls和xlsx格式文件.总结起来就是用于读取和写入Microsoft Office二进制和OOXML文件格式的.NET库.
具体介绍请参考官方.
aardio中调用c#程序集的方法和com很像, 其他帖子里也分享过调用C#的例子了,
有人希望提供个调用简单例子, 那么下面就举一个操作excel文件的例子.
//调用C#程序集 import dotNet; var appDomain = dotNet.clr().createAppDomain(); //加载应用程序目录下的程序集 var NPOIdll = appDomain.loadFile("\res\NPOI.dll"); //声明接口 var workbook = NPOIdll.new("NPOI.HSSF.UserModel.HSSFWorkbook"); //创建表 var table = workbook.CreateSheet("aardio demo"); //模拟20行20列数据 for ( i = 0; 20; 1) { var row = table.CreateRow(i); for (j = 0; 20; 1) { var cell = row.CreateCell(j); cell.SetCellValue(j); } } workbook.Write(io.fullpath("\data\demo.xls"));
因为npoi是开源的, 所以有些功能不好用的话,我们可以自己去修改下, 然后重新编译即可,
例如我上面就是把 workbook.write()给重写了下, 将参数由原来的 Filestream stream 改为了string path , 这样我们在保存的时候, 只需要提供给它路径即可.
如果你用的是网上原版dll , 那么利用write()来保存为excel文件的时候需要添加如下代码:
//导入 System.IO.File var File = appDomain.mscorlib.import("System.IO.File") //调用 System.IO.File.Create() 创建 System.IO.FileStream 对象 var fs = File.Create( io.fullpath("/data/test2.xls") ); workbook.Write(fs); fs.Close();
注意:
工程里面的dll已经是修改之后的.
示例工程下载:
原版NPOI v2.4.1 版本DLL:(请重新下载,原来包里少了个dll)
关于v2.4.1版本生成xlsx示例工程:
另外, 我把修改后的npoi的源码也发到了百度盘上,
请注意:我编译的是ALLIinOne这个文件夹内的
链接:https://pan.baidu.com/s/1t2cuZzKdn0WnxrICTnhhoQ
提取码:x47o
回复#2 @hi_aardio :
关于不能生成xlsx是因为1楼发布的包里少了个dll, 重新下载即可,
另外, 因为这个ooxml需要调用其他dll, 所以新建工程添加bin文件夹, 然后把所有dll放入到这里然后调用即可.
1楼我重新上传了xlsx的工程示例
//调用C#程序集 import dotNet; var appDomain = dotNet.clr().createAppDomain(); //加载应用程序目录下的程序集,dll程序集包含路径默认的是bin,将所有dll放入bin文件夹中 var NPOIdll = appDomain.loadFile("\bin\NPOI.OOXML.dll"); //声明接口 var workbook = NPOIdll.new("NPOI.XSSF.UserModel.XSSFWorkbook"); //创建表 var table = workbook.CreateSheet("aardio demo"); //模拟20行20列数据 for ( i = 0; 20; 1) { var row = table.CreateRow(i); for (j = 0; 20; 1) { var cell = row.CreateCell(j); cell.SetCellValue(j); } } //导入 System.IO.File var File = appDomain.mscorlib.import("System.IO.File") //调用 System.IO.File.Create() 创建 System.IO.FileStream 对象 var fs = File.Create( io.fullpath("/data/test2.xlsx") ); workbook.Write(fs); fs.Close();
回复#4 @admin :
老大,能不能给个读xlsx的例子。研究了两天,网上搜到的都是c#的例子,毫无头绪。
var appDomain = dotNet.clr().createAppDomain(); var File = appDomain.mscorlib.import("System.IO.File") var fs = File.Open( io.fullpath("/data/test2.xlsx") ); var NPOIdll = appDomain.loadFile("\bin\NPOI.OOXML.dll"); var workbook = NPOIdll.new("NPOI.XSSF.UserModel.XSSFWorkbook");
这里不知怎么把fs传进去,没法打开workbook。
回复#5 @jelin :
我查了一下msdn文档,你这个应该用 OpenRead
var fs = File.OpenRead( io.fullpath("/data/text3.xlsx"), );
NPOI函数也支持直接传递string path路径给它
xlsx的读取 , 百度搜一搜, 这些东西网上都有示例 , 有些属性不知道咋用就看NPOI源码或者用dnspy打开dll查查里面的属性和方法.
不要再追问了, 真没时间整这些, 目前我还用不上,
同时希望你们如果研究透了也能分享下心得或者一些代码
//调用C#程序集 import dotNet; var appDomain = dotNet.clr().createAppDomain(); //加载应用程序目录下的程序集 var NPOIdll = appDomain.loadFile("\bin\NPOI.OOXML.dll"); //声明接口 var workbook = NPOIdll.new("NPOI.XSSF.UserModel.XSSFWorkbook",io.fullpath("/data/text3.xlsx")); //读取表 var sheet = workbook.GetSheet("Sheet1"); //或者用 //var sheet = workbook.GetSheetAt(0); for(i=0;sheet.LastRowNum;1){ var row = sheet.GetRow(i); for(j=0;row.LastCellNum-1;1){ if(row.GetCell(j).CellStyle.Index == 0){ //number var value = row.GetCell(j).NumericCellValue; console.log(i,j,"数字",value); } elseif(row.GetCell(j).CellStyle.Index == 1){ //string var value = row.GetCell(j).StringCellValue; console.log(i,j,"字符串",value); } } }
版主不用花时间来回复 了
======================
想不到还有这样的用法
var workbook = NPOIdll.new("NPOI.XSSF.UserModel.XSSFWorkbook",io.fullpath("/data/text3.xlsx"));
参照网上的一些文档 ,我尝试了一下,下面这些是可行的
--------------------------------------------------------------
//导入 System.IO.File
var File = appDomain.mscorlib.import("System.IO.File")
//检查文件是否存在
var fs = File.Exists( io.fullpath("/data/demo.xls") );
//打开文件
var fs_open = File.OpenRead(io.fullpath("/data/demo.xls"))
--------------------------------------------------------------
但是问题还是和jelin一样,卡在了如何把fs传进去的问题上,
尝试找过类似 的方法
下面是C#的方法
--------------------------------------------------------------
var path = System.Environment.CurrentDirectory + "\\目标文件.xlsx"; FileStream f2 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); XSSFWorkbook xssf = new XSSFWorkbook(f2); xssf.SetSheetName(0, "sheet1");
--------------------------------------------------------------
然后各种尝试,仍然读不出文件内容 .
有遇到 同样问题的朋友,能有解决方法的,向贡献一样自己的方法
回复#10 @hi_aardio :
我上面已经说了, 你要传filestream进去可以的 , 改成上面的, 然后把fs传进去就行了额, 还是写下代码吧
//调用C#程序集 import dotNet; var appDomain = dotNet.clr().createAppDomain(); //加载应用程序目录下的程序集 var NPOIdll = appDomain.loadFile("\bin\NPOI.OOXML.dll"); var File = appDomain.mscorlib.import("System.IO.File") var fs = File.OpenRead( io.fullpath("/data/text2.xlsx") ); //声明接口, 顺便传入fs var workbook = NPOIdll.new("NPOI.XSSF.UserModel.XSSFWorkbook",fs); //读取表 var sheet = workbook.GetSheet("Sheet1"); ...
当然, 你要可读可写, 还是要用open(path,mode,access), 注意里面有三个参数, 最后一个是读写控制, 这个也是可以的
回复#16 @txhelp :
可以直接用啊, 你就认为是个常规com组件即可, C#内部自会解析
还是接上面一楼的示例代码, 添加如下
//合并单元格 table.AddMergedRegion(NPOIdll.new("NPOI.SS.Util.CellRangeAddress",com.int32(0),com.int32(0), com.int32(0), com.int32(2))); table.CreateRow(0).CreateCell(0).SetCellValue("aardio demo"); //获取和查看合并的第一个单元格 var range = table.GetMergedRegion(0); console.log(range.FirstRow)//开始行 console.log(range.LastColumn)//结束列
我估计你是卡在了合并里面的参数了吧, 有时候aardio中不能自动转换数值类型到c#的话, 就自己用com.int/float啥的指定下.
目前我用不上NPOI , 所以很多东西你们需要自己研究, aardio调用它应该是没问题的.
登录后方可回帖
增加个画图的例子: