MS要将Office Open XML 格式成为国际标准,实现一统江湖。MS将Office 格式开放,还是向好的方面发展。OOXMLSDK 2.0 将会在Office 2010版本正式发行,现使用Bata版本进行读写Excel2007。

说先俺的系统配置:

系统:Windows Server 2003 R2 X64

开发软件:Microsoft VS 2008 Team

Office版本:Excel2007

OOXML版本:Office Open XML SDK2.0 Bata

关于OOXML的标准就不多说,先看看文件结构,单元格映射信息存放在部件tableSingleCells中,工作表信息存放在sheet,共享字符信息存放在sharedStrings中

使用到的主要部件将会有 xl/tables/tableSingleCells1.xml,xl/worksheets/sheet1.xml

4.1建立XML映射:俺有这样一张表Book1.xlsx,想通过读取Excel数据,显示出来。

俺想通过XML  MAP工作表的单元格,然后程序读取映射单元格中的值和Xpath。首先,建立映射关系,映射表中『用户名称』,『客户联系人』,『联系电话』,『客户经理』,『客户经理联系电话』,『业务类型』,『前端数量』,『业务类别』,『区域』字段值。第一步,要建立XML映射文件,T1schema.Xml映射文件如下:

<?xml version="1.0" standalone="yes"?>

<QQTintDataSet xmlns="http://tempuri.org/QQTintDataSet.xsd">

<yyexcel>

<id>1</id>

<Customer></Customer>

<CustomerContact></CustomerContact>

<CustomerTelephone></CustomerTelephone>

<AccountManager></AccountManager>

<AMTelephone></AMTelephone>

<AccessType></AccessType>

<AccessAmount></AccessAmount>

<BusinessName></BusinessName>

<Regional></Regional>

</yyexcel>

</QQTintDataSet>

在Excel2007“开发工具”选项卡上的“XML”组中,单击“源”。在“XML 源”任务窗格中,单击“XML 映射”。添加T1schema.Xml映射文件, 确认后如图

拖动『ns1:Customer』到单元格『用户名称』,如此类推,建立XML映射

关于Excel2007如何显示“XML源”按钮

http://office.microsoft.com/zh-cn/excel/HP102064082052.aspx

4.2 编写程序,读取单元格的值。新建一个控制台应用程序解决方案ConsoleApplication2,在ConsoleApplication2项目添加引用,引用为Office Open XML SDK2.0 Bata安装目录下DocumentFormat.OpenXml.dll文件,打开Program.cs,在文件头添加使用的库:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using DocumentFormat.OpenXml.Packaging;

using DocumentFormat.OpenXml.Spreadsheet;

using System.Text.RegularExpressions;

using System.IO.Packaging;

4.2.1创建一个方法,用于读取单元格的值,并返回其值。方法名称为getCellValue,参数依次为文件名,工作表名称,单元格名称。

private static string getCellValue(string fileName, string sheetName, string addressName)

打开Excel2007文件,并取得相应的工作表

SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false);

IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);

WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);

Worksheet worksheet = worksheetPart.Worksheet;

获取存在worksheetPart内部SingleCellTablePart(xl/tables/tableSingleCells1.xml)

SingleCellTablePart customxmlmap = worksheetPart.SingleCellTablePart;

获取符合条件的SingleXmlCell集合

IEnumerable<SingleXmlCell> singlexmlcells = customxmlmap.SingleXmlCells.Descendants<SingleXmlCell>();

获取每个SingleXmlCell

foreach (SingleXmlCell cellxmlmap in singlexmlcells)

{

获取xmlCellPr子树

XmlCellProperties xmlcellp = cellxmlmap.XmlCellProperties;

获取子树xmlPr的Xpath属性(映射Xpath)和单元格名称(XML属性r)

Console.WriteLine("单元格{1}映像信息:{0}", xmlcellp.XmlProperties.XPath, cellxmlmap.CellReference.Value);

}

获取单元格行序号

uint rowIndex = GetRowIndex(addressName);

获取单元格列名称

string colName = GetColumnName(addressName);

根据行序号和列名称,得到单元格

Cell cell = GetSpreadsheetCell(worksheet, colName, rowIndex);

如果单元格是数字格式,在sheet.xml中<v></v>直接表示单元格的值,所以直接返回,如表中单元格“I4”。

if (cell == null)

{

//指定的单元格不存在.

return "找不到任何符合条件的单元格";

}

if (cell.DataType == null)

{

if (cell.CellValue != null)

{

return cell.CellValue.Text;

}

}

如果单元格是字符格式或布尔格式,需要根据sheet.xml中t属性值转换。t=”s”表示字符,t=”b”表示布尔,

string str = "找不到任何符合条件的值";

switch (cell.DataType.ToString())

{

case "s":

单元格的值是字符类型

SharedStringItem item;

SharedStringTablePart shareStringPart;

获取shareString部件

if (document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().Count() > 0)

{

shareStringPart = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();

int requestedString = Convert.ToInt32(cell.CellValue.Text);

根据在sheet.xml中<v></v>表示单元格的值,查找shareString获取相应字符。

item = shareStringPart.SharedStringTable.Elements<SharedStringItem>().ElementAt(requestedString);

str = item.Text.Text;

}

Console.WriteLine("单元格的类型是:S");

break;

case "b":

单元格的值是布尔类型,根据在sheet.xml中<v></v>表示单元格的值,转换成相应字符。

if (cell.CellValue.Text == "1")

{

str = "TRUE";

}

else

{

str = "FALSE";

}

Console.WriteLine("单元格的类型是:B");

break;

default:

Console.WriteLine("单元格的类型是:{0}",cell.DataType);

break;

}

4.2.2以上出现三个辅助函数,分别是GetRowIndex,GetColumnName,GetSpreadsheetCell,说明如下:

// 创建正则表达式,根据单元格名称匹配行序号.

private static uint GetRowIndex(string cellName)

{

Regex regex = new Regex(@"/d+");

Match match = regex.Match(cellName);

return uint.Parse(match.Value);

}

// 根据单元格名称匹配列序号,从而得出单元格列序号.

private static string GetColumnName(string cellName)

{

// 创建正则表达式,根据单元格名称匹配单元格列序号.

Regex regex = new Regex("[A-Za-z]+");

Match match = regex.Match(cellName);

return match.Value;

}

根据行列关系获取单元格

private static Cell GetSpreadsheetCell(Worksheet worksheet, string columnName, uint rowIndex)

{

IEnumerable<Row> rows = worksheet.GetFirstChild<SheetData>().Elements<Row>().Where(r => r.RowIndex == rowIndex);

if (rows.Count() == 0)

{

// 找不到匹配的行号.

return null;

}

IEnumerable<Cell> cells = rows.First().Elements<Cell>().Where(c => string.Compare(c.CellReference.Value, columnName + rowIndex, true) == 0);

if (cells.Count() == 0)

{

// 找不到匹配的单元格.

return null;

}

return cells.First();

}

4.2.3主过程如下:

static void Main(string[] args)

{

string str = getCellValue("Book1.xlsx", "业务流程相关信息", "E4");

Console.WriteLine("单元格的值是:{0}",str);

}

4.2.4运行结果如下:

getCellValue("Book1.xlsx", "业务流程相关信息", "I4");

getCellValue("Book1.xlsx", "业务流程相关信息", "B3");

4.使用Office Open XML SDK访问Excel2007数据表相关推荐

  1. mysql触发器中访问mssql数据表_[数据库]一个利用触发器(trigger)实现数据库表的审计功能(audit)的例子--针对ms sql实现...

    首先建立数据库Test,建立两个表,我们命名为grades和audit,利用audit实现对grades的审计功能,其中grades用于存放学生的成绩,包括"sdudentID,course ...

  2. 使用DB查询分析器实现异构数据源中数据表的相互访问

    1  引言   硕士程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本<DB Query A ...

  3. Office Open XML学习(1)-创建excel文档,并向单元格中插入字符串

    做企业级应用,跟office打交道是少不了的.这里的Office不仅仅局限于微软的Office,还有第三方的Open Office之类..Net传统的Office操作方法(比如OleDB,OWC之类) ...

  4. 如何操作 Office Open XML 格式文档

    摘要: Office Open XML格式文件代替了早期的二进制Office系统文件.本文档向您介绍了包含在一个格式化文档中的组件以及展示这些文件功能的一些场景 . Frank Rice,微软公司 适 ...

  5. 如何操作 Office Open XML 格式文档(转)

    原文地址为: 如何操作 Office Open XML 格式文档(转) 摘要: Office Open XML格式文件代替了早期的二进制Office系统文件.本文档向您介绍了包含在一个格式化文档中的组 ...

  6. User Word Automation Services and Open XML SDK to generate word files in SharePoint2010

    SharePoint 2010 has established a new service called "Word Automation Services" to operate ...

  7. The supplied data appears to be in the Office 2007+ XML

    错误原文 The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that d ...

  8. Office Open XML——从底层出发,自定义你的Office组件

    文章目录 简介 安装 XML查看器 基本原理 初试 获取XML 修改XML Word相关 设置单元格边距 PowerPoint 相关 封装 opc-diag XML压缩 其他 参考文献 简介 Offi ...

  9. EPPlus管理 Office Open XML库

    EPPlus管理 Office Open XML库 ExcelPackage.Configure添加了在第一次调用 ExcelPackage 构造函数之前调用的 新静态方法: 指定 json 配置文件 ...

最新文章

  1. hust1347(归并排序求逆序对)
  2. Swing开发界面时的一个bug复盘
  3. 阿里NIPS 2017论文解读:如何降低TensorFlow训练的显存消耗?
  4. SQL Server 2005如何起用 xp_cmdshell
  5. 编辑距离及编辑距离算法
  6. POJ - 3257 Cow Roller Coaster (背包)
  7. phpdesigner8 php7.0,大家千万别用PHPDesigner8 的项目替换,多说是泪,改整个站点中!
  8. Oracle学习总结(4)——MySql、SqlServer、Oracle数据库行转列大全
  9. 按键精灵打怪学习-自动寻路回打怪点
  10. 数据结构算法——1006. 线性链表的插入与删除
  11. 移动开发中的基础知识总结
  12. java dismiss_窗口泄漏甚至在dialog.dismiss()
  13. Forest详细介绍
  14. 【python】终于解决了cv2.VideoWriter生成视频后视频文件始终为1KB且无法播放的问题
  15. ES6入门--let的基本使用
  16. LaTex - PPT 换页动态效果(亲测有效)
  17. memcpy内存重叠问题
  18. CodeForces Ania and Minimizing 1230B
  19. Java搭建Spark程序,提交到Yarn
  20. 对搜索引擎排名不友好的五种网站-SEO

热门文章

  1. 搞不懂为啥都要去字节跳动,太心累了。。。
  2. HBITMAP与BITMAP 的区别 BMP图像的格式
  3. 国外开发者分享如何通过Medium写作赚钱美元
  4. jsp 网站 mysql 数据库连接 tomcat 服务器配置server
  5. 如何在mac系统的finder边栏显示Macintosh HD
  6. 百度网盘共享文件夹复制服务器错误,分享链接失效?百度网盘秘密武器共享文件夹功能使用详解-rar文件怎么打开...
  7. iOS开发——网络请求数据处理
  8. C/C++反三角函数使用注意事项
  9. 追光几何(EverCraft) 与大疆教育 RoboMaster 建立合作伙伴关系
  10. 【路径规划】基于灰狼算法求解旅行商TSP问题matlab源码