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

By admin at 2022-03-07 • 6人收藏 • 9983人看过

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


image.png

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


42 个回复 | 最后更新于 2024-02-23
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.chengxu.xyz/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的例子吗?就是按行读取的

2023-12-25   #28

怎么你的附件是3.0的,我官网下的是2.1的


2023-12-26   #29

请问reoGrid,鼠标放单元格右下角出现+号拖动给其它单元格赋值怎么禁止,找了很多事件 IsCancelled = true都不行 

这样子+号不明显但还是能拖动

ws.SelectionStyle = WorksheetSelectionStyle.None;


找到了:

.DisableSettings(WorksheetSettings.Edit_DragSelectionToFillSerial);

2023-12-27   #30

请问大家一个新问题,删除行时,方便起见我删第一行

worksheet.DeleteRows(0,1)

总数大于1行没问题,最后一行时报超出范围,想了很多办法都不知道错哪里了

System.ArgumentOutOfRangeException:“指定的参数已超出有效值的范围。

Arg_ParamName_Name”

我用笨办法,最后一行时先AppendRows(1)插入个空白行,感觉怪怪的

2023-12-27   #31

回复#30 @小星碰头 :

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("\tt.xlsx"));
var Worksheet = reoGridControl1.CurrentWorksheet;

Worksheet.Cells.Item["A1"].Data = "aardio World!";

Worksheet.DeleteRows(0, 1);


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

测试没报错......

话说这个是表格控件, 只要显示界面貌似就有很多行吧? 不理解你说的"总数大于1行没问题,最后一行时报超出范围" 是啥意思? 有代码吗

2023-12-29   #32

回复#31 @admin :

谢谢回复,我在c#里用的,就是appendrow 比如10行,然后deleterow,前9行没问题,到最后一行就报错

2024-01-03   #33
2024-01-05   #34

这个控件还有一个不好的地方,可能我没摸索到,标题行的字体好像不能调,中文特别小而且靠上排

image.png

2024-01-06   #35

请问一下大家,按回车键(enter)焦点单元格的移动方向从水平更改为垂直

2024-01-07   #36

回复#35 @ouyang789 :

https://reogrid.net/document/behavior/

2024-01-08   #37

回复#35 @ouyang789 :

image.png

2024-01-11   #38

回复#37 @小星碰头 :

谢谢

2024-01-11   #39

回复#36 @admin :

谢谢

2024-01-11   #40

请问一下大家,打印时怎样加入页眉和页码

2024-02-21   #41

各位大佬,怎么实现文本居中!!

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



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

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

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...