C# Excel控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# Excel控件相关的知识,希望对你有一定的参考价值。

找一个Excel控件,我用的是VS2005,需要在WinForm窗体上添加一个Excel控件,希望能麻烦各位帮忙找一个,如果有使用文档就更好了。我的邮箱是pengpei_gg@126.com 谢谢大家了!!

FarPointSpread
简介
FarPoint Spread是一个高级的电子表格COM组件,在单元格级上提供无比强大的灵活性,可最大化控制数据的显示和录入,并提供大量的事件响应用户的操作。FarPoint Spread提供导入导出功能,包括能够导入导出Excel 97和2000文件格式;增强的打印,多种单元格类型,计算公式,一个64bit的DLL等。FarPoint Spread将允许你创建一个多达20亿行和20亿列的电子表格。

全球最强的报表第三方控件

FarPoint Spread V8.0的最新特征?

新的计算函数
能够创建自定义单元格
一个64-bit DLL
用于注解的图形形状和色彩
新的OCX方法用于从缓冲保存和装入
新的事件用于循环参考
增强的外观
表头和Sheet的外观增强
滚动条的外观增强
sheet tabs的外观增强
选中高亮增强
当导出到html提供额外的选项
使用control-click应用第二次排序

FarPoint Spread V7.0的新特征?

多Sheet支持
跨Sheet计算参考
支持Unicode
内建支持行列移动
新的科学符号单元格类型
增强的数字格式化
更快的排序
更稳定的Spread Designer
自定义滚动条的颜色,宽度和高度
双击表头自动调整列宽到文本的宽度
可放缩的打印
放缩适合页面的打印
水平中心和垂直中心打印
页眉/注脚的控制字符(如 /time,/date)
增强对图像类型的支持包括.gif和.jpg
支持展开的文本提示(允许大于1000字符)
当装入文件时LoadTextFile缺省至32,000个字符
当单元格获取焦点时,可隐藏/显示焦点方块
当使用EditModePermanent时自动定位光标
可转换的列标签(字母到数字和数字到字母)
按钮单元格的文本和图像对齐
最大列宽计算能够包括按钮单元格
刷新数据集不影响表头
复选框单元格有类似Windows的外观
滚动条提示事件
当所有数据从数据库装入完成时触发DataLoaded
FarPoint Spread通用特征:

创建一个多达20亿行和20亿列的电子表格
在电子表格中任意拖放数据
用剪贴板copy/cut/paste,并支持快捷键
通过锁定单元格数据防止数据编辑
通过允许单元格数据溢出到相邻单元格创建表头
冻结最顶层的行或最左边的列滚动,使某些数据在任何时候都被浏览
导入和导出Microsoft Excel BIFF8格式的电子表格文件
使用操作模式,设置表格为只读,或让它作为单选或多选的列表框
使用33个Action属性执行任务,包括保存和打印电子表格
单元格格式化
每个单元格最多显示32K的数据
通过改变任何单元的字体和背景色自定义你的界面
用6种边框风格高亮任何单元格或单元格块
用12种单元格类型提供最流行的数据和数据库格式
按钮:单元格中显示一个push button,包括文本,图形或两者都包括
复选框:单元格中显示一个复选框,或图片,允许true,false,或者灰度状态
组合框:单元格中显示一个下拉下拉列表框
日期:显示或允许编辑格式化的日期
支持Year 2000
编辑控件:显示或允许编辑单元格的文本
浮动: 显示或允许编辑格式化的浮点值
格式化的PIC: 显示或允许编辑格式化的PIC值
整数: 显示或允许编辑整数值
自绘: 用WindowsAPI显示用户定义图片
图片: 单元格中显示图片(.bmp或.ico)文件格式
静态文本: 单元格中显示不可编辑不可滚动的文本
时间: 显示或允许编辑时间格式的值
支持可自定义化的打印及预览
提供强大的计算引擎
支持数据绑定
强大的表格设计器(Spread Designer)

以上供参考
参考技术A 没有所谓的Excel控件,
你可以把Excel的数据显示在DataGridView里,
就是想在画面上嵌入一个Excel的话,
这个最适合你的情况了:
如何使用 WebBrowser 控件在 Visual C# 2005 或 Visual C# .NET 中打开 Office 文档

http://support.microsoft.com/kb/304662

参考资料:http://support.microsoft.com/kb/304662

参考技术B

正在使用中:C1ExcelBook 组件

参考技术C C#连接Excel的方法与连接Access的方法类似,同样可以使用OldDBConnection,如下:

String excelPath = "你的Excel文件绝对路径";
ConnectionString = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + excelPath + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";

数据库连接好后就是查询,查询的方法跟Asscess一样只是Excel的表面后面都需要加上一个’$'字符.比如:

DataTable tempDataTable = new DataTable();
String strSql = "SELECT * FROM [sheet1$]";
DataAdapter da = new OleDbDataAdapter(strSql, myConnection);
da.Fill(tempDataTable);

参考资料:http://www.zhongsisi.com/?p=493

参考技术D 有一个FarPoint的很不错,不只excel,pdf什么的都有,你可以自己去网上搜索一下,参考:http://blog.sina.com.cn/s/blog_609666090100emj0.html

参考资料:http://blog.sina.com.cn/s/blog_609666090100emj0.html

.Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)

最近项目中需要一个导出Excel报告的功能,假期搜了一下,把其中比较主流的列一下,仅供参考。

功能需求:

  1. 创建并写入.xlsx Excel2007+版本的电子表格文件
  2. 不需要office组件支持,终端电脑无需安装ms office
  3. 简单的format,style,chart和formula支持(不用过于复杂),并且能够插入图片
  4. 速度,保证数据在万行以上表格写入速度

效果图:  

 技术分享

一、ClosedXML

主页:https://github.com/ClosedXML/ClosedXML

需要引用OpenXMLSDK(DocumentFormat.OpenXml.dll),以简易面向对象的方式操作文件(类似Visual Basic for Applications (VBA)),文档和例子都比较完善

技术分享
            //创建workbook
            using (var wb = new XLWorkbook(XLEventTracking.Disabled))
            {
                //设置默认Style
                var style = wb.Style;
                style.Font.FontName = "Microsoft YaHei";
                style.Font.FontSize = 11;

                //添加Sheets
                var ws = wb.Worksheets.Add("Sheet001");
                wb.Worksheets.Add("Sheet002");

                //手动cell赋值
                ws.Cell(1, 1).Value = "Project";
                ws.Cell(1, 2).Value = "Project001";
                ws.Cell("A2").Value = "User";
                ws.Cell("B2").Value = "User001";
                ws.Cell(3, 1).SetValue("Create Date");
                ws.Cell(3, 2).SetValue(DateTime.Now);

                //加重第一列文字
                var rngHeader = ws.Range(1, 1, 3, 1);
                rngHeader.Style
                    .Font.SetBold()
                    .Font.SetFontColor(XLColor.White)
                    .Fill.SetBackgroundColor(XLColor.SkyBlue)
                    .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);

                //合并cell
                ws.Cell(5, 1).Value = "Data List";
                var rngTitle = ws.Range(5, 1, 5, 5);
                rngTitle.Merge();//ws1.Row(5).Merge();
                rngTitle.Style
                    .Font.SetBold()
                    .Font.SetFontSize(15)
                    .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
               
                //插入表格或数据,设置Timespan format
                var fakeData = Enumerable.Range(1, 5)
                    .Select(x => new FakeData
                    {
                        Time = TimeSpan.FromSeconds(x * 123.667),
                        X = x,
                        Y = -x,
                        Address = "a" + x,
                        Distance = x * 100
                    }).ToArray();

                var table = ws.Cell(6, 1).InsertTable(fakeData);
                table.Style.Font.FontSize = 9;
                var data = ws.Cell(13, 1).InsertData(fakeData);
                data.Style.Font.FontSize = 9;
                ws.Range(7, 1, 18, 1).Style.DateFormat.Format = "HH:mm:ss.000";

                //插入图片
                var image = ws.AddPicture("1.png");
                image.MoveTo(ws.Cell(19, 1).Address);
                image.Scale(0.3);
                //调整列距
                ws.Columns().AdjustToContents();//会花费写入数据一倍的时间
                //保存文件
                wb.SaveAs("ClosedXML.xlsx");
            }
View Code

 

二、EPPlus

主页:https://github.com/JanKallman/EPPlus/

EPPlus不需要任何别的引用,文档和例子还算比较全

技术分享
            //创建workbook
            using (var p = new ExcelPackage())
            {
                //添加Sheets
                var ws=  p.Workbook.Worksheets.Add("Sheet001");
                p.Workbook.Worksheets.Add("Sheet002");

                //手动cell赋值
                ws.Cells[1,1].Value = "Project";
                ws.Cells[1, 2].Value = "Project001";
                ws.Cells["A2"].Value = "User";
                ws.Cells["B2"].Value = "User001";
                ws.Cells[3,1].Value = "Create Date";
                ws.Cells[3,2].Value = DateTime.Now;
                ws.Cells[3, 2].Style.Numberformat.Format = "YYYY/MM/DD";

                //加重第一列文字
                var rngHeader = ws.Cells[1, 1, 3, 1];
                rngHeader.Style.Font.Bold = true;
                rngHeader.Style.Font.Color.SetColor(System.Drawing.Color.White);
                rngHeader.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                rngHeader.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.DodgerBlue);
                rngHeader.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;

                //合并cell
                ws.Cells[5, 1].Value = "Data List";
                var rngTitle = ws.Cells[5, 1, 5, 5];
                rngTitle.Merge = true;
                rngTitle.Style.Font.Size = 15;
                rngTitle.Style.Font.Bold = true;
                rngTitle.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;


                //插入表格或数据,设置Timespan format
                var fakeData = Enumerable.Range(1, 5)
                    .Select(x => new FakeData
                    {
                        Time = TimeSpan.FromSeconds(x * 123.667),
                        X = x,
                        Y = -x,
                        Address = "a" + x,
                        Distance = x * 100
                    }).ToArray();

                ws.Cells[6, 1].LoadFromCollection(fakeData, true, OfficeOpenXml.Table.TableStyles.Medium27);
                ws.Cells[13, 1].LoadFromArrays(
                    fakeData.Select(x => new object[] {x.Time, x.X, x.Y, x.Address, x.Distance}));
                ws.Cells[6, 1, 18, 1].Style.Numberformat.Format = "HH:mm:ss.000";

                //插入图片
                var image = ws.Drawings.AddPicture("picture", new FileInfo("1.png"));
                image.From.Row = 19;
                image.From.Column = 0;
                image.SetSize(30);
                //设置默认Style
                ws.Cells[ws.Dimension.Address].Style.Font.Name = "Microsoft YaHei";
                //调整列距
                ws.Cells.AutoFitColumns(0);//会花费写入数据一倍的时间
                //保存文件
                p.SaveAs(new FileInfo("EPPlus.xlsx"));
            }
View Code

 

三、NPOI

官网:https://github.com/tonyqus/npoi  .netcore version:https://github.com/dotnetcore/NPOI

需要引用SharpZipLib,可以读写Word和Excel,例子比较全,系统点的文档没有找到,不过是国人的开源项目,百度应该能找到很多

参考:

http://blog.csdn.net/pan_junbiao/article/details/39717443   

http://www.cnblogs.com/yinrq/p/5590970.html 

http://www.cnblogs.com/hanzhaoxin/p/4232572.html 基于NPIO的Report控件

技术分享
            using (var fs = new FileStream("NPOI.xlsx", FileMode.Create, FileAccess.Write))
            {
                //创建workbook
                IWorkbook wb = new XSSFWorkbook();

                //添加Sheets

                var ws = wb.CreateSheet("Sheet001");
                wb.CreateSheet("Sheet002");

                //手动cell赋值
                ws.CreateRow(0).CreateCell(0).SetCellValue("Project");
                ws.CreateRow(0).CreateCell(1).SetCellValue("Project001");
                ws.CreateRow(1).CreateCell(0).SetCellValue("User");
                ws.CreateRow(1).CreateCell(1).SetCellValue("User001");
                ws.CreateRow(2).CreateCell(0).SetCellValue("Create Date");
                ws.CreateRow(2).CreateCell(1).SetCellValue(DateTime.Now);

                wb.Write(fs);
            }
View Code

四、Benchmarks

以上三个控件的简单测试,10000条数据写入

技术分享
            using (var wb = new XLWorkbook(XLEventTracking.Disabled))
            {
                var ws = wb.AddWorksheet("1");
                ws.Column(1).Style.DateFormat.Format = "HH:mm:ss.000";
                int rowCount = 1;
                foreach (var fakeData in data)
                {
                    rowCount++;
                    ws.Cell(rowCount, 1).Value = fakeData.Time;
                    ws.Cell(rowCount, 2).Value = fakeData.X;
                    ws.Cell(rowCount, 3).Value = fakeData.Distance;
                    ws.Cell(rowCount, 4).Value = fakeData.Address;
                }
                wb.SaveAs("ClosedXML.xlsx");
            }

            using (var wb = new ExcelPackage())
            {
                var ws = wb.Workbook.Worksheets.Add("1");
                ws.Column(1).Style.Numberformat.Format = "HH:mm:ss.000";
                ws.Cells[1, 1].LoadFromCollection(data,true,
                    OfficeOpenXml.Table.TableStyles.Medium2,
                    System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance,
                    new System.Reflection.MemberInfo[]
                    {
                        typeof(FakeData).GetProperty("Time"),
                        typeof(FakeData).GetProperty("X"),
                        typeof(FakeData).GetProperty("Distance"),
                        typeof(FakeData).GetProperty("Address")
                    });
                wb.SaveAs(new FileInfo("EPPlus.xlsx"));
            }

            using (var fs = new FileStream("NPOI.xlsx", FileMode.Create, FileAccess.Write))
            {
                var wb = new XSSFWorkbook();
                var ws = wb.CreateSheet("1");
                int rowCount = 0;
                IRow row;
                foreach (var fakeData in data)
                {
                    row = ws.CreateRow(rowCount++);
                    row.CreateCell(0).SetCellValue(fakeData.Time.ToString(@"hh\\:mm\\:ss\\.fff"));
                    row.CreateCell(1).SetCellValue(fakeData.X);
                    row.CreateCell(2).SetCellValue(fakeData.Distance);
                    row.CreateCell(3).SetCellValue(fakeData.Address);
                }
                wb.Write(fs);
            }
View Code
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 2 (10.0.15063)
Processor=Intel Core i7-6700K CPU 4.00GHz (Skylake), ProcessorCount=8
Frequency=3914068 Hz, Resolution=255.4887 ns, Timer=TSC
  [Host]     : .NET Framework 4.7 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.2110.0
  Job-EJASFH : .NET Framework 4.7 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.2110.0
Method MeanErrorStdDevGen 0Gen 1Gen 2Allocated
ClosedXML 337.6 ms NA 2.5647 ms 9625.0000 7062.5000 2812.5000 47.26 MB
EPPlus 145.8 ms NA 0.2533 ms 5000.0000 3250.0000 2000.0000 24.68 MB
NPOI 263.4 ms NA 5.8716 ms 10500.0000 7343.7500 2375.0000 55.65 MB

 

 

 

 

总体上EPPlus在速度和内存上都最佳,感觉ClosedXML在API调用上方便一些,文档写全面一些。

五、其他

SpreadSheetLight 之前项目使用的,读写都可以,需要OpenXMLSDK 2.5

ExcelDataReader Excel 03-07 文件读取,只需要快速读取excel文件的可以用这个

 

以上是关于C# Excel控件的主要内容,如果未能解决你的问题,请参考以下文章

C# winform中以excel的方式编辑表格

C# Excel常用控件总结

C#中如何隐藏按钮控件

.Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)

C#ListView控件OleDb方法读取EXCEL

如何改变C#的Panel控件的边框颜色