Excel文档处理之Open XML

引言

在使用Open XML处理Excel文档之前,需要先确定它的作用范围,Open XML适用于2007版本及以上的Excel文档的处理。

第二步就是配置Open XML的开发环境:Open XML相关下载链接

1、新建Excel文档

咱们先从一个实际的Excel文档入手,在桌面上新建一个Excel文档,默认会有一个Sheet,可以理解为一个工作表或一个页面。

   

创建一个Excel所等价的代码如下:

//本代码段为简化代码,只作理解之用。
//SpreadsheetDocument:Excel文档的变量类型
//以path中所指定的地址和名称创建一个Excel文档
//SpreadsheetDocumentType.Workbook:指明创建的文件类型为后缀名为.xlsx的Excel文档
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook);
将刚刚新建的Excel文档的后缀名改为rar(压缩包格式),然后打开压缩包,看到如下图所示的目录,其中xl文件夹中的文件很重要,需要仔细研究。打开xl文件夹。

先打开workbook.xml,默认会用浏览器显示其内容,workbook.xml主要对sheet(理解为工作表或页面)进行宏观性全局性的描述。下图中,第二行开始到结束,由叫做“workbook”的元素包裹在最外层,可以把workbook理解为工作薄,但不完全等价于Excel文件。红色方框框起来的元素为“ sheets”,它的内部描述了该文档有几个sheet(理解为工作表或页面)。由于新建的Excel文档默认只有一个sheet,所以“sheets”元素的内部只有一个“sheet”元素,对应着创建Excel文档后默认的“Sheet1”工作表,图中的sheet元素内部,有三个必备属性:r:id、sheetId、name。r:id是字符串类型的属性,以“rId”+数字作为其内容;sheetId为数字类型的属性;name就是该sheet的名字。前两个属性都属于sheet的id值,都是隐含的内在的属性,name属性是外在的显露出来的属性,图中name属性的值“Sheet1”刚好对应新建的Excel中的默认的sheet名称。

2、添加一个sheet工作表

倘若在Excel中添加一个工作表,并将其命名为“测试”,会有什么变化呢?具体的操作要么把Excel文件后缀名恢复原样,要么可以再新建一个Excel,并添加一个工作表。再次打开workbook.xml文件时,会发现多了一个sheet元素。该sheet元素对应的r:id和sheetId的值都比默认的sheet元素的值增加了1,name属性的值为“测试”。

添加一个工作表等价的代码如下:

//本代码段为简化代码,只作理解之用。
//workbookPart:管理Workbook工作薄
//WorksheetPart:管理工作表,一个WorksheetPart对应一个工作表
//workbookPart.AddNewPart<WorksheetPart>():添加一个新的WorksheetPart
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
//workbookPart.Workbook.Sheets:Workbook元素中的Sheets元素
//Sheets.Elements<Sheet>():Sheets元素中Sheet元素的集合
//Elements<Sheet>().LastOrDefault():Sheet元素集合中最后一个Sheet元素或默认的Sheet元素
Sheet sheet = workbookPart.Workbook.Sheets.Elements<Sheet>().LastOrDefault();
//定义默认的sheetId值
//当工作薄中一个工作表也没有时,便以1作为新添加的工作表的Sheet元素的Id值
//当工作薄中存在工作表时,便将最后一个工作表的Id值加1作为新添加的工作表的Sheet元素的Id值UInt32Value sheetId = 1;
if (sheet != null)
{
    sheetId = sheet.SheetId + 1;
}
//AppendChild:添加一个子元素
workbookPart.Workbook.Sheets.AppendChild(new Sheet()
{
    //Id为字符串类型的Id属性
    Id = workbookPart.GetIdOfPart(worksheetPart),
    //SheetId为数值类型的Id属性
    SheetId = sheetId,
    //工作表的名称
    Name = sheetName
});

3、向sheet工作表中添加内容

在上方压缩包目录图中,打开worksheets文件夹。该目录下有一个名为“sheet1.xml"的文件,对应默认的”Sheet1“工作表。有多少个工作表,这个文件夹里面就有多少个sheet文件,sheet文件对所有非空表格的信息都进行了登记。

打开sheet1.xml文件,内容如下图所示。其中sheetViews元素可以描述当前选中的表格所在的位置,由于新建的Excel文档没有选中表格,所有sheetViews没有描述;sheetData元素记录非空表格的位置及表格内容,同样,由于Excel没有写入任何内容,sheetData中也就没有记录。

这时,对空白的Sheet1工作表添加如下图所示的内容。分别在A1、B2、C3单元格添加了“1”、“数据”、“Data”,并选中B1单元格。添加这些数据后,sheet1.xml文件主要的变化如下图。sheetViews元素中,selection元素描述选中的单元格为B1。sheetData元素中,有三个row元素,分别对应添加的“1”、“数据”、“Data”;在row元素中,r属性表示第几行,c元素记录非空表格的位置及表格内容;在c元素中,r元素表示单元格的位置,其中第一个c元素中,v元素表示单元格的内容,第二个和第三个c元素的解释请看下面的内容。

在xl文件夹中,多了一个名为sharedStrings.xml的文件,这个文件名字面上的意思是共享字符串,这是Excel中很有意思的一个东西,它将可能会重复用到的字符串都存储于这个文件中。打开它,内容如下图所示,si元素中存储着可能会重复用到的字符串,可以想象,当N个单元格中的内容都是“数据”时,那么Excel就不用为每个单元格分配额外的存储空间,而只需要在上图中的v元素中存储该字符串的引用即可,例:在下图中,数据在sharedStrings.xml文件中的位置是第0个(默认从第0个开始),上图中c元素中t属性赋值为“s”,表明该单元格的内容为共享字符串,v元素中的值为0,表示该单元格中的内容为sharedStrings.xml文件中第0个字符串。

向表格中添加内容的代码如下:

//本代码段为简化代码,只作理解之用。
//SheetData:记录非空单元格的位置及内容
//worksheetPart:管理工作表,一个WorksheetPart对应一个工作表
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().FirstOrDefault();
//Row:工作表中的行
Row row = sheetData.Elements<Row>().LastOrDefault();
//添加普通数据
void AddData(object data)
{
    Cell cell = row.AppendChild(new Cell()
    {
        //CellValue:单元格内容
        CellValue = new CellValue() { Text = data.ToString() },
        //DataType&
  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值