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调用它应该是没问题的.
登录后方可回帖


增加个画图的例子:
var patriarch = table.CreateDrawingPatriarch(); var a1 = NPOIdll.new("NPOI.HSSF.UserModel.HSSFClientAnchor",255, 125, 1023, 150, 0, 0,2, 2); var line1 = patriarch.CreateSimpleShape(a1); line1.ShapeType = 20;//HSSFSimpleShape.OBJECT_TYPE_LINE; line1.LineStyle = 0;//HSSFShape.LINESTYLE_SOLID //在NPOI中线的宽度12700表示1pt,所以这里是0.5pt粗的线条。 line1.LineWidth = 6350; var rec1 = patriarch.CreateSimpleShape(a1); //此处设置图形类型为矩形 rec1.ShapeType = 1;//HSSFSimpleShape.OBJECT_TYPE_RECTANGLE; //设置填充色 rec1.SetFillColor(125, 125, 125); //设置边框样式 rec1.LineStyle = 6;//HSSFShape.LINESTYLE_DASHGEL; //设置边框宽度 rec1.LineWidth = 25400; //设置边框颜色 rec1.SetLineStyleColor(100, 0, 100);