调用c#强大的ReoGrid免费表格控件,用于显示、编辑、打印、导出和导入Excel电子表格

By admin at 2022-03-07 • 5人收藏 • 4930人看过

ReoGrid : Powerful free component to show, edit, print, export and import Excel spreadsheet in .NET application

ReoGrid 是 C# 编写的。.NET 电子表格控件(类似 Excel)。支持单元格合并,边框样式,图案背景颜色,数据格式,冻结,公式,宏和脚本执行,表格事件等

开源免费.


官方: https://reogrid.net


image.png


image.png



Line Chart


import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=854;bottom=546)
winform.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=855;bottom=547;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

import dotNet;
import System.Drawing; 
import System.Windows.Forms;
var dll = dotNet.load("\unvell.ReoGrid.dll");
var ReoGrid = dll.import("unvell.ReoGrid");
var reoGridControl1 = ReoGrid.ReoGridControl();
System.Windows.Forms.CreateEmbed(reoGridControl1,winform.custom);

//reoGridControl1.Load(io.fullpath("\MyTemplate.xlsx"));
var Worksheet = reoGridControl1.CurrentWorksheet;

Worksheet.Cells.Item["A1"].Data = "aardio World!";
Worksheet.Cells.Item["A1"].Style.TextColor = ReoGrid.Graphics.SolidColor.Red;
Worksheet.Cells.Item["A1"].Style.BackColor = ReoGrid.Graphics.SolidColor.Black;

Worksheet.Item["A2"] = dotNet.object({
  { "", 2008, 2009, 2010, 2011, 2012 },
  { "City 1", 3, 2, 4, 2, 6 },
  { "City 2", 7, 5, 3, 6, 4 },
  { "City 3", 13, 10, 9, 10, 9 },
  { "Total", "=SUM(B3:B5)", "=SUM(C3:C5)", "=SUM(D3:D5)",
    "=SUM(E3:E5)", "=SUM(F3:F5)" },
});

Worksheet.AddHighlightRange("B2:F2");
Worksheet.AddHighlightRange("A3:A6");
Worksheet.AddHighlightRange("B3:F5");

var c1 = ReoGrid.Chart.LineChart();
c1.Location = ReoGrid.Graphics.Point(220, 160);
c1.Size = ReoGrid.Graphics.Size(400, 260);
c1.Title = "Line Chart Sample";

// Specify data source.
// Data source is created from serial data and names for every serial data.
c1.DataSource = ReoGrid.Chart.WorksheetChartDataSource(Worksheet, "A3:A6", "B3:F5",ReoGrid.RowOrColumn.Row);
c1.DataSource.CategoryNameRange = ReoGrid.RangePosition("B2:F2");

// add line chart instance on worksheet to display it
Worksheet.FloatingObjects.Add(c1);

winform.show();
win.loopMessage();


Column Chart

列图表:

只需要将上面的代码, 设定为列模式,改变一句话:

var c1 = ReoGrid.Chart.ColumnChart();

image.png


Bar Chart

image.png

var c1 = ReoGrid.Chart.BarChart();

.

.

.

还有 areachart , piechart , doughnutchart 等等.


给表格增加Group和outlIine扩展线

var outline = Worksheet.AddOutline(ReoGrid.RowOrColumn.Row, 3, 5);
outline.Collapse();    // collapse
outline.Expand();      // expand

screenshots.gif


我这里只是演示在aardio中调用c#的图形控件, 其他关于控件怎么使用,自行参考官方文档.


ReoGrid.zip


28 个回复 | 最后更新于 2022-12-12
2022-03-17   #1

回复#4 @admin :

再更新一个MiniExcel读取Excel文件,官网地址:https://gitee.com/dotnetchina/MiniExcel#%E7%AE%80%E4%BB%8B

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add()
/*}}*/

import dotNet;
import System.Windows.Forms;
var Forms = System.Windows.Forms;
var DataGridView = Forms.CreateEmbed("DataGridView",winform);
 
import System.Data; 

dll = dotNet.loadFile("res/MiniExcel.dll")
MELibs = dll.import("MiniExcelLibs")
dt = MELibs.MiniExcel.QueryAsDataTable("C:\Users\Administrator\Desktop\test.xlsx", false, "Sheet1");
dv = System.Data.DataView(dt);

DataGridView.DataSource=dv;
DataGridView.EditMode=2;

winform.show();
win.loopMessage();
return winform;

国人写的,开源免费,据说内存占用少,效率非常高

读写上百万条数据没问题。官网有测试数据对比。

2022-03-18   #2

太强大了,强大过头了

Worksheet.AfterCellEdit =function(a,b){
import console
console.open()
console.log(a,b.NewData)
}
reoGridControl1.RunScript("alert('hello world');");

QQ截图20220318153046.jpg

2022-03-23   #3
var t=dll.import("unvell.ReoGrid.CellTypes");
worksheet.Cells.Item["D8"].Data=t.ButtonCell("Hello世界");
var button=t.ButtonCell("你好,世界");
worksheet.Cells.Item["D3"].Body=button
worksheet.Cells.Item["D1"].Body=t.HyperlinkCell("https://www.aardio.com/", true);
worksheet.Cells.Item["D2"].Body=t.ProgressCell()
worksheet.Cells.Item["D2"].Data="60%"

var dropdown = t.DropdownListCell(
  "Apple", "Orange", "Banana", "Pear", 
  "Pumpkin", "Cherry", "Coconut"
);

worksheet.Cells.Item["B2"].Data = dropdown;

QQ截图20220323213640.jpg

分享自定义单元格类型的一些用法

2022-03-26   #4

回复#32 @hi_aardio :

我在VB.net下用ReoGrid测试了一下,1000万条数据(100000行x100列),保存后的文件大约21M多,完全没问题,用时(包括生成+保存)大约15秒左右。

代码:

Public Class Form1
    Private Sub ReoGridControl1_DoubleClick(sender As Object, e As EventArgs) Handles ReoGridControl1.DoubleClick

        ReoGridControl1.CurrentWorksheet.AppendRows(100000)
        ReoGridControl1.CurrentWorksheet.AppendColumns(100)

        For row = 1 To 100000
            For col = 1 To 100
                ReoGridControl1.CurrentWorksheet.SetCellData(row, col, "Hello VB.net")
            Next
        Next

        ReoGridControl1.Save("C:\Users\Administrator\Documents\dotNetProject\VB20220326\output.xlsx")



    End Sub
End Class

无标题.png

2022-08-19   #5

回复#2 @the100s :

请问下 编辑怎么取整行的数据,然后编辑回车好像不起效果

2022-08-19   #6

回复#5 @andrew7baker :

可以用UsedRange先获取有数据的范围,然后再遍历整行数据。

编辑的话,好像只能一个个单元格编辑。

反正用循环还是挺快的。

image.png

2022-08-19   #7

楼上 我提的问题应该是:如何获取编辑的当前row的所有 cell,因为我接了数据库要更新编辑行的数据。

image.png

2022-08-20   #8

image.png


怎么能获取编辑行的positon

2022-08-21   #9

回复#8 @andrew7baker :

UsedRange 就是获取有数据的单元格范围。

有了UsedRange以后就可以用.Rows.Count和.Columns.Count获取最大行数和列数。

剩下遍历就可以了。

2022-08-21   #10

回复#8 @andrew7baker :

b.pos

参考https://reogrid.net/document/script-execution/的

ondatachange event小节


2022-10-08   #11

楼主:1.unvell.ReoGrid.zip 例子中,键盘输入 到达不了控件,是dotNet的问题吗?

2.现在的情况是控件显示了界面,但按键盘上下左右和回车键控件内没有反应;

3.请问怎么解决dotNet控件键盘消息输入的问题,或拦截输入给控件的键盘消息?

2022-11-09   #12


像System库一样 定义用户库 unvell.ReoGrid

import dotNet;

dotNet.reference({
  ["Antlr3.Runtime"] = $"~/lib/unvell/ReoGrid/.res/Antlr3.Runtime.dll";
  ["unvell.ReoGrid"] = $"~/lib/unvell/ReoGrid/.res/unvell.ReoGrid.dll";
  ["unvell.ReoScript"] = $"~/lib/unvell/ReoGrid/.res/unvell.ReoScript.dll";
});

dotNet.import("unvell.ReoGrid")

// Change the context strip menu languages
with unvell.ReoGrid.LanguageResource {
	Menu_InsertSheet = "插入";
	Menu_DeleteSheet = "删除";
	Menu_RenameSheet = "重命名...";	
	Sheet_RenameDialog_Title = "重命名工作表";
	Sheet_RenameDialog_NameLabel = "名称(&N): ";
	Button_OK = "确定";
	Button_Cancel = "取消";
}

/**intellisense()
unvell.ReoGrid = .Net unvell.ReoGrid 名字空间\n!dotNetNameSpace.
end intellisense**/

然后导入 unevll.ReoGrid 就可以像C#一样用了

import win.ui;
/*DSG{{*/
mainForm = win.form(text="ReoGrid";right=757;bottom=467)
mainForm.add()
/*}}*/

import console
import unvell.ReoGrid
import System.Windows.Forms

var grid = unvell.ReoGrid.ReoGridControl()

//绑定界面
System.Windows.Forms.CreateEmbed(grid, mainForm)

var sheet = grid.CurrentWorksheet;
sheet.Cells.Item["D7"].Data = "aardio";

var script = `workbook.currentWorksheet.getCell("B1").data = 'hello world';`;
grid.RunScript(script);

//grid.SetSettings(unvell.ReoGrid.WorkbookSettings.View_ShowSheetTabControl, false);
grid.SheetTabWidth = 250
 
sheet.SelectionRange = unvell.ReoGrid.RangePosition("B3:F5");
//sheet.SelectionStyle = unvell.ReoGrid.WorksheetSelectionStyle.FocusRect;
//sheet.SelectionMode = unvell.ReoGrid.WorksheetSelectionMode.Row;

sheet.BeforeCellKeyDown = function(s, e){
	//console.log( e.KeyCode)
}

var setCellFocus = function(row, col){
	sheet.FocusPos = unvell.ReoGrid.CellPosition(row, col);
	sheet.StartEdit()
}

mainForm.isDialogMessage = function(hwnd,msg){
	if( msg.message == 0x100/*_WM_KEYDOWN*/){
		var focusPos = sheet.FocusPos;
		select(msg.wParam) {
			case 0xD/*_VK_RETURN*/{				
				setCellFocus(focusPos.Row + 1,  focusPos.Col - 1)
			}
			case 0x9/*_VK_TAB*/{
				setCellFocus( focusPos.Row,  focusPos.Col + 1 )
			}
		}
	}
	return ;
}

mainForm.show();
return win.loopMessage();

ReoGrid.zip

2022-11-09   #13

回复#13 @大山 :

winform 默认处理一些按键消息

重写isDialogMessage就好了。

1
winform.isDialogMessage = function(){}

具体看楼上代码

2022-11-15   #14

回复#8 @andrew7baker :

sheet.CellMouseDown = function(s, e){
	var pos = sheet.CreateAndGetCell(e.CellPosition); 
	console.log( pos, pos.Row, pos.Column )
}


2022-11-15   #15

回复#6 @jerryxjr1220 :

S21115-22444090.png

setCellData 最后一个参数是可以用数组的

2022-11-17   #16

回复#17 @codex :

高手,学习了!

2022-12-01   #17

ReoGrid create memory workbook

import console; 
import unvell.ReoGrid

// create memory workbook instance
var grid = unvell.ReoGrid.ReoGridControl.CreateMemoryWorkbook();

// get worksheet 1 (by default, a workbook contains a default empty worksheet)
var sheet = grid.Worksheets[1];

// set data into cell A1 
sheet.Cells.Item["A1"].Data = "aardio";

// set data into cell A2, B2, C2, D2
sheet.Cells.Item["A2"].Data = 10
sheet.Cells.Item["B2"].Data = 20
sheet.Cells.Item["C2"].Data = "=A2+B2"
sheet.Cells.Item["D2"].Data = "=SUM(B2:C2)"


// set data into cell[2,0]
var data = dotNet.object({
	{10, 20, "=A3*B3", "=SUM(A3:C3)"},
	{17, 28, "=A4*B4", "=SUM(A4:C4)"}
})
sheet.SetCellData(2, 0, data)


// Add customize formula functions
FormulaExtension = unvell.ReoGrid.Formula.FormulaExtension
/*
FormulaExtension.CustomFunctions.Item["myFunc"] = function(cell, args){
	if (args.Length == 0)  return null;
    return string.upper( args[1] )
}
*/
// The CustomFunctions type is a dictionary, so we can call the Add() method 
FormulaExtension.CustomFunctions.Add("myFunc", function(cell, args){
	if (args.Length == 0)  return null;
    return string.upper( args[1] )
})

sheet.Cells.Item["A5"].Data = `=myFunc("aardio")`;


// Customize name reference provider
unvell.ReoGrid.Formula.FormulaExtension.NameReferenceProvider = function(cell, name){
	if (name == "myName1") return 10;
	else if (name == "myName2") return 20;
	else return null;
 };
sheet.Cells.Item["B5"].Data = "=myName1";
sheet.Cells.Item["C5"].Data = "=myName2"; 
 
// Run Script to add functions
grid.RunScript("script.myfunc = data => '[' + data + ']';");
sheet.SetCellData("D5", `=myfunc(A5)`)

 
//To get range that contains data in a worksheet, use UsedRange peroperty.
var range = sheet.UsedRange;
console.log( range )

sheet.IterateCells(range, function(row, col, cell){
	// c# row col start from zero
	console.log(string.format(" %s 行:%s 列   值:%s", row +1, col +1, cell.Data)) 
	// return true to continue iterate, return false to abort
	return true;
});


/*
// unvell.ReoGrid.IO.FileFormat
public enum FileFormat : ushort
{
	ReoGridFormat = 1,
	CSV = 10,
	Excel2007 = 30,
	_Auto = 0,
	_Custom = 100
}
*/
 // save sheet to file
sheet.Cells.Item["A1"].Data = "aardio";
grid.Save(".\res\SampleData.xlsx", unvell.ReoGrid.IO.FileFormat.Excel2007)
console.pause(true);


2022-12-01   #18

回复#23 @codex :请问一下,自定义的公式和名称在保存之后,是没法用的,会显示无效,对吧?


2022-12-02   #19

回复#24 @sunjc :

自定义的公式和名称只能在reogrid中显示,execl不支持的


2022-12-02   #20

回复#4 @jerryxjr1220 :

为什么我的十万行20列数据保存要6分钟呢

2022-12-02   #21

回复#26 @rays2004 :

你要是按照他那个for循环里一个个setcell值,肯定慢很多,因为你这样会花费大量的时间去进行c#和aardio之间的数据转换,两个解决办法,1.直接利用我上面写的数组赋值方法,2.参考https://www.htmlayout.cn/t/21322 这篇文章,写一个数据转接dll

2022-12-03   #22

回复#27 @admin :

但是还是慢 我的需求是打开一个10万X20的excel表,按照某些规则进行数据更改,单元格颜色等设置 设置后保存,不全是数据转换的问题 ,请教一个该怎么用arrdio 解决 数据处理问题不大 主要是保存特别慢 10分钟

2022-12-03   #23

回复#29 @rays2004 :这个问题我一直关注,试了一些,感觉 首先libxl是最快的,其次win10下普遍比win7下快。

2022-12-03   #24

回复#29 @rays2004 :

非要用这个的话,直接用c#写软件吧,你用不到界面显示表格,不如不用它,界面显示肯定需要时间

2022-12-03   #25

回复#31 @admin :

好的 谢谢 

2022-12-04   #26

回复#29 @rays2004 :

那么大量的数据读写用excel本身就不合理啊,excel的作用是为了便于数据量交小的情况下,可视化显示数据或者图形。

大数据量的话,肯定首选是数据库了,而且对于大数据量的读写也不应该依赖图形界面,没有图形界面的话,速度可以快很多。

2022-12-12   #27

回复#1 @jerryxjr1220 :

能给几个query的例子吗?就是按行读取的

登录后方可回帖

登 录
信息栏
公 告:

专注分享

谢绝纯提问

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

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

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