VSTO学习之路:学习使用Epplus(1)

关于读取其它工作簿数据的几个方式的比较:

1、VBA的GetObject方法,会调用Excel程序打开工作簿(虽然不可见,但确实是打开的)

2、SQL,使用繁琐缺少灵活,不支持单元格样式的操作,也似乎不支持delete语句删除源数据。

3、使用Open XML SDK,基于Open XML,不依赖于Excel程序,但步骤繁琐。

4、Epplus,基于OpenXML,简单灵活,不依赖Excel程序打开工作簿,处理数据的速度快。

下载:Epplus,引用Epplus,然后  using OfficeOpenXml

样例工作簿:

创建对象,构造函数接收一个FileInfo对象

1 string path = @"E:\studyvs\open xml\2.xlsx";
2 FileInfo info = new FileInfo(path);
3 ExcelPackage doc = new ExcelPackage(info);

要新建一个工作簿,工作簿至少要有一个工作表

1 string path = @"E:\studyvs\open xml\333.xlsx";
2 if (File.Exists(path))
3 {
4     File.Delete(path);
5 }
6 FileInfo info = new FileInfo(path);
7 ExcelPackage doc = new ExcelPackage(info);
8 doc.Workbook.Worksheets.Add("mySheet");
9 doc.Save();

遍历工作簿中的工作表

 1 string path = @"E:\studyvs\open xml\2.xlsx";
 2 FileInfo info = new FileInfo(path);
 3 ExcelPackage doc = new ExcelPackage(info);
 4 ExcelWorksheets sheets = doc.Workbook.Worksheets;
 5 //Worksheets[i]的索引可以是工作表name,也可以是工作表在工作簿中的排列位置
 6 for (int i = 1; i <= sheets.Count; i++)
 7 {
 8     string s = string.Format("PositonID是{0}的工作表名称是{1}", i.ToString(), sheets[i].Name);
 9     System.Windows.Forms.MessageBox.Show(s);
10 }

使用foreach

1 foreach (ExcelWorksheet sheet in sheets)
2 {
3     string s = string.Format("第{0}个工作表名称是{1}", sheet.Index, sheet.Name);
4     System.Windows.Forms.MessageBox.Show(s);
5 }

以上两种方式对工作表的输出顺序是完成相同的,依次是:mySheet、sheet1,4,3,2

支持Linq

ExcelWorksheet sheet= sheets.Single(s => s.Name == "mySheet")

引用单元格

 1 //使用的单元格区域地址
 2 string address = sheet.Dimension.Address;
 3 //最大行数
 4 int maxrow = sheet.Dimension.Rows;
 5 //最大列数
 6 int maxcolumn = sheet.Dimension.Columns;
 7 //已使用的单元格区域
 8 ExcelRange usedrange = sheet.Cells;
 9 //单元格A1
10 ExcelRange cell1 = sheet.Cells["A1"];
11 //第一个单元格
12 ExcelRange cell2 = sheet.Cells[1, 1];
13 //区域A1:E5
14 ExcelRange range1 = sheet.Cells["A1:E5"];
15 //区域A1:E5
16 ExcelRange range2 = sheet.Cells[1, 1, 5, 5];

取得单元格的值

1 //单元格的值
2 object value = sheet.Cells[1, 1].Value;
3 //获得单元格的强类型值
4 string name = sheet.Cells[1, 1].GetValue<string>();
5 double age = sheet.Cells[2, 2].GetValue<double>();
6 //区域的值是二维数组
7 object[,] values = (object[,])sheet.Cells.Value;

取得目标区域的值并赋值给当前活动工作表

1 object[,] values = (object[,])sheet.Cells.Value;
2 //Globas.Sheet1获了文档级项目的Sheet1工作表;数组的维度从0开始
3 Range rng = Globals.Sheet1.Range["A1"].Resize[values.GetUpperBound(0)+1,values.GetUpperBound(1)+1];
4 rng.Value = values;

合并同一目录下的所有工作簿:

将同一个文件夹下的工作簿中的第一张工作表(当然也可以是所有工作表,本例只取一个)合并到新的工作簿text.xlsx中。

 1 string path = @"E:\studyvs\open xml\test.xlsx";
 2 FileInfo info = new FileInfo(path);
 3 //要合并到的工作簿
 4 ExcelPackage doc = new ExcelPackage(info);
 5 int i = 1;
 6 foreach (string excel in Directory.GetFiles(@"E:\studyvs\open xml\"))
 7 {
 8     //using帮助释放资源
 9     using (ExcelPackage p = new ExcelPackage(new FileInfo(excel)))
10     {
11         ExcelWorksheet sheet = p.Workbook.Worksheets.First();
12         doc.Workbook.Worksheets.Add(i.ToString(), sheet);
13         i++;
14     }
15 }
16 //保存工作簿
17 doc.Save();
18 System.Windows.Forms.MessageBox.Show("合并成功");

时间: 2024-12-09 18:31:14

VSTO学习之路:学习使用Epplus(1)的相关文章

多线程学习之路-学习wait和notify

package threadtest; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class QueueTest01 { private LinkedList<Object> list = new LinkedList<Object>(); private AtomicInteg

(转)如何学习Java技术?谈Java学习之路

51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领域其他技能的学习. [在原先<学好Java之我见>的基础上重新整理而成] Java - 近10年来计算机软件发展过程中的传奇,其在众多开发者心中的地位就如“屠龙刀”.“倚天剑”. Java是个平台,我只想说说我对学好Java的一点看法,希望对初学者有所帮助. 1. 思考一下 学习Java之前,先别

Azure云平台学习之路(三)——Cloud Services

1.什么是云服务? 能够部署高度可用的且可无限缩放的应用程序和API.简而言之,就是你写的CMD程序按照一定的框架进行少量修改就能运行在Azure云平台上. 2.Azure云服务有什么特点? (1)专注应用程序而不是硬件,PaaS的一种. (2)支持多种框架和语言. (3)集成了运行状况监视和负载平衡. (4)自动缩放优化成本和性能 3.建立云服务之前,我们需要建立一个云存储,来记录我们的程序的日志信息(当然,这不是必须的) (1)选择左边导航栏的"存储".主面板上显示的是所有已有的存

linux学习之路之LVM

试想一种情况,当初我们在规划磁盘的时候,只给某一个磁盘或分区之划分了30G的容量,但是后来,随着业务的需求,该磁盘或者分区的使用量会越来越大,等到以后再有数据存放时,发现该磁盘或者分区的容量不够用,此时该怎么办了?可以新增一个磁盘,经过格式化,挂载等过程就可以使用这个磁盘了,再将原来磁盘的数据完全的复制过来.等到后来又发现,规划的磁盘又太大了,然后又使用上述方法来减少磁盘的大小.虽然这种方法可行,但是效率低,比较复杂.不应该是我们首选的方法. 当然,我们可以这样做,将多个磁盘或者分区(PV)组合

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

一个女大学生的代码学习之路(二)

首先说一下,写这种文章是由于我在四月四日晚上,在手动搭建自己的第一个ssh项目的时候,遇到了一个配置的问题,怎么解决也弄不好,当时是四号晚上九点,我看了一眼表,我就想两个小时之内,我要是能搞定就算行了,但是其实,我搞到三点才OK(凌晨),那时候已经是五号了,转天是一家子去扫墓的时候,结果我居然以这种一个理由没有去,理由是我太累了么?我只是就是搭了一个架子,就是由于我的包太混乱了,导致不兼容,所以tomcat总也不启动,你可能认为好笑,这么简单一个问题怎么就费这多多时间呢,但是作为一个刚接触三框架

kafka学习之路(二)——提高

kafka学习之路(二)--提高 消息发送流程 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理.为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息.     过程: 1.Producer根据指定的partition方法(round-robin.hash等),将消息发布到指定topic的partition里面 2.kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

Java学习之路(二)--Thinking in Java

针对昨天Java学习之路(一)--Thinking in Java中的类的静态方法不能访问创建非静态类,给出了将内部类修改成为static静态类,操作方便简单.现在给出第二种不需要添加删除的另一种极为高效的方式.可以将内部类从你所创建的类中复制粘贴到类外,作为一个外部类,在static主方法中就可以创建类的引用了. 源代码如下: ? class test{ int s; char c; } public class test1 { public static class test{ int s;