aardio调用NPOI操作excel文件

By admin at 2021-07-27 • 1人收藏 • 3768人看过

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

谢谢 明白了

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...