aardio调用NPOI操作excel文件

By admin at 2021-07-27 • 0人收藏 • 1598人看过

NPOI是由c#编写的开源excel / word / PPT 操作类库, 并可以同时兼容xls和xlsx格式文件.总结起来就是用于读取和写入Microsoft Office二进制和OOXML文件格式的.NET库.

具体介绍请参考官方.

aardio中调用c#程序集的方法和com很像, 其他帖子里也分享过调用C#的例子了, 

有人希望提供个调用简单例子, 那么下面就举一个操作excel文件的例子.


image.png

//调用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已经是修改之后的.

示例工程下载:

aardio工程9.zip


原版NPOI v2.4.1 版本DLL:(请重新下载,原来包里少了个dll)

NPOI_Dll_bin.zip


关于v2.4.1版本生成xlsx示例工程:

aardio工程9.zip


另外, 我把修改后的npoi的源码也发到了百度盘上, 

请注意:我编译的是ALLIinOne这个文件夹内的

链接:https://pan.baidu.com/s/1t2cuZzKdn0WnxrICTnhhoQ 

提取码:x47o

image.png

image.png


18 个回复 | 最后更新于 2021-08-22
2021-07-27   #1

增加个画图的例子:

image.png

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);


2021-07-28   #2

回复#1 @admin :

请教关于xlsx的读取和写入问题

我尝试使用xssf的方法,输出为null

var workbook = NPOIdll_xlsx.new("NPOI.XSSF.UserModel.XSSFWorkbook");

win.msgbox(workbook)

也想通过 加载OOXML.dll

var NPOIdll_xlsx = appDomain.loadFile("\res\NPOI.OOXML.dll");

未果

2021-07-28   #3

感谢楼主分享经验。也想要一个读写xlsx的例子。先谢了!

2021-07-29   #4

回复#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();

image.png

2021-07-29   #5

回复#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。

2021-07-29   #6

回复#4 @admin :

谢谢楼主的耐心指导

2021-07-29   #7

回复#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);
		}
	}
}

image.png

2021-07-29   #8

回复#7 @admin :

感谢回复同时也抱歉占用了宝贵时间。

发现自己水平太差,我会继续努力学习。

2021-07-29   #9

回复#8 @jelin :

对C#来说我也是新手, 你们问的这些我都是去msdn或者网上搜的, 

有实在搞不定的我才去问jacenHe老大 , 其实这样也是一个学习的过程. 共勉吧

2021-07-29   #10

版主不用花时间来回复 了

======================

想不到还有这样的用法

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");

--------------------------------------------------------------


然后各种尝试,仍然读不出文件内容 .

有遇到 同样问题的朋友,能有解决方法的,向贡献一样自己的方法

2021-07-29   #11

dnSpy可能会有不少的帮助,大家可以看一下

image.png

2021-07-29   #12

回复#10 @hi_aardio :

image.png

我上面已经说了, 你要传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), 注意里面有三个参数, 最后一个是读写控制, 这个也是可以的

2021-07-29   #13

感谢 楼主 和 hi_aardio 的分享与探讨,下载了 dnSpy,还不太会用。

7#楼的代码第19、23行,关于数据类型判断的代码:

if(row.GetCell(j).CellStyle.Index == 0){ //number
CellStyle.Index 应为 CellType

 即

if(row.GetCell(j).CellType == 0){ //0:number; 1:string


2021-07-29   #14

回复#13 @jelin :

那你仔细看看下面我录的dnspy动态GIF图, 感受下

GIF.gif


2021-07-31   #15

回复#14 @admin :

有心了,感谢。

dnspy真是个好软件。

2021-08-17   #16

请教一个问题 

sheet.GetMergedRegion()

返回的是一个

CellRangeAddress类
改怎么声明这个类呢
2021-08-22   #17

回复#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)//结束列

image.png

我估计你是卡在了合并里面的参数了吧, 有时候aardio中不能自动转换数值类型到c#的话, 就自己用com.int/float啥的指定下.

目前我用不上NPOI , 所以很多东西你们需要自己研究, aardio调用它应该是没问题的.

2021-08-22   #18

谢谢 明白了

登录后方可回帖

登 录
信息栏
公 告:

专注分享

谢绝纯提问

谢谢合作!
本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...