微软的Openxml在2006年底杀出重围,成为那个年代标准之争的胜利者。时至今日,已经有6个年头了。可是遍翻各个博客,涉及到Openxml操作Excel的原创文章屈指可数,而且往往没有深度,所说的东西也都没有说到问题的点子上。

之所以有上面的抱怨,是因为我最近研究Openxml操作Excel,问题一个接着一个,而且诡异的要命。网上的帖子没有一个说道根儿上的,当然肯定有人敝帚自珍了。其实安装完openxml sdk之后,在开始菜单有一个小程序是很好用的,可以看到某一个Excel的完整生成代码(C#)Microsoft Office Open XML SDK 2.0\Open XML SDK 2.0 Productivity Tool。好了,下面写一下我最近遇到的问题、解决办法和分析(代码就不贴了,没什么意思,下面的分析才算最主要的)

  1. 创建CellRow

这里需要注意的是:Excel中的物理行列存储是按照从上到下、从左到右的规则。而且不创建的行列,在xml中是不存在的。举例来说,我们新建一个空的Excel,此时SheetData节点是空的

我们在B3中填入Hello worldSheetData值如下

此时我们插入行列必须使用SheetData.InserAt方法插入RowRow.InsertAt方法插入Cell,否则Excel在渲染和呈现的时候会报错(更直白点的说法是:第N行的物理顺序要在N+1行的上面,第X单元格要在X+1单元格的前面)。

  1. 合并单元格
  • 创建第一个MergeCell

这里需要注意的是:创建第一个合并单元格时,往往MergeCells还不存在,所以我们不仅仅要做创建合并单元格的操作,还要负责将MergeCells节点插入到Sheetx.xml中。而此时遇到的问题往往也是因为MergeCells节点在worksheet根节点中的顺序引起的。其正确位置是应在SheetData节点下面,且紧邻SheetData。所以操作的时候应使用Worksheet.InsertAfter<MergeCells>方法

  • 解决了Mergecells位置的问题之后,还有一个与合并单元格相关的问题

如果我们按照Openxml自带的sdk中的demo的话,合并C1:E10后打开Excel会报错,而合并C1:C2却没有问题。

其实sdk自带的demo中给出的是“合并相邻的两个单元格”示例,所以在例子中是没有任何问题的,但是这给人一个误导:只要左上角和右下角的单元格创建了,然后再设置一下MergeCell.Reference = "C1:E10"ok了。错误的原因是合并区域内的单元格必须全部创建,即我们要创建C1:E10区间内的所有单元格,这样问题就解决了。分析到这里,也仅仅是一个表象。根本的原理是:合并单元格只是Excel在呈现时给大家的视觉效果而已,其根本是xml的节点数据

  • sdk自带的demo简单修改后,还会遇到一个问题。假如我们将合并相邻单元格改为A2:A1B2:A2后,打开Excel同样会报错。原因出在MergeCell.Reference

A2:A1 <mergeCell ref="A2:A1"/>

B2:A2 <mergeCell ref="B2:A2"/>

细心的读者,如果注意观察sheetx.xml就会发现上面的两行合并单元格的节点内容,这是打开Excel报错的直接原因。其根本原因是违背了文章之初所指出的物理存储顺序:先上后下、先左后右。所以上面的错误修改后应该是

A2:A1 <mergeCell ref="A1:A2"/>

B2:A2 <mergeCell ref="A2:B2"/>

  1. 向合并的单元格赋值

假如有合并单元格A1:C10,我们要给该合并单元格赋值时,必须并且只能将值赋给A1单元格。其原理也牵扯到sheetx.xml的物理存储结构,就不深入展开。下面是sheetx.xml中合并单元格存储值的截图

  1. 取合并单元格的值

假如有合并单元格A1:C10,我们要取A3的值。

根据上面的描述,真实值是存储在A1单元格中,所以需要通过其它的方式找到合并区域左上角的单元格,并取其值(本例应该A1

  1. number类型单元格的值

该类型的单元格的值不是存储在sharedstring中,且节点没有"t"属性,其值是存储在该单元格的InnerText

  1. Date类型单元格的值

该类型的单元格的值不是存储在sharedstring中,且节点没有"t"属性,其值是存储在该单元格的InnerText中,Date.ToOADate()的值,所以返回的时候需要转换成Date类型

发个博客真费劲啊,这个格式调整真让人蛋疼!

Openxml读取和生成简单类型的Excel相关推荐

  1. python3使用openpyxl生成xlsx类型的excel表格

    一.使用介绍 使用openpyxl生成xlsx类型的execl,非常方便.先介绍下用到的相关模块与函数: (1)Workbook:工作簿模块,在内存创建一个工作簿. (2)ExcelWriter:使用 ...

  2. dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息

    在 Office 中,可以在 PPT 里面插入表格,插入表格有好多不同的方法,对应 OpenXML 文档存储的更多不同的方式.本文来介绍如何读取 PPT 内嵌 ole 格式的 xls+ 表格的方法 在 ...

  3. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  4. 使用Poi读取xlsx类型的Excel

    其实这个跟读取xls是一样的,就是简单的换了个东西而已,下面直接进入正题. 1.使用Poi写xlsx类型的Excel package com.company.poi;import org.apache ...

  5. 利用Excel表格中数据生成地图类型可视化图形案例

    利用Excel表格中数据生成地图类型可视化图形案例 一.准备工作 二.读取excel数据 三.创建地图并进行设置 创建地图 设置地图相关参数 四.渲染保存为网页文件 写在最后 某人工作不设限,创新不断 ...

  6. 随机数写excel java代码_基于python实现在excel中读取与生成随机数写入excel中

    搜索热词 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再生成随机数作为学生的考试成绩. 首先要用到的数据库有:xlwt,xlr ...

  7. 【造轮子/更新】打造一个简单的万能Excel读写工具

    ExcelReads(简单Excel通用读写器) ExcelReads是什么? https://github.com/MatrixSeven/ExcelReads 这是一个通用的简单的Excel读取器 ...

  8. python怎么读取excel-Python|读、写Excel文件(三种模块三种方式)

    python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pandas进行excel读写: 为了方 ...

  9. python 如何自动生成exl_python如何做excel自动化

    python做excel自动化的方法:首先安装python工具包:然后从指定文件路径读取excel表格,进行一定操作:接着保存到另一个excel文件:最终调用[excel_update]方法即可. p ...

最新文章

  1. Matplotlib使用scatter函数在Python中绘制气泡图(bubble plot)、通过size参数指定数据点的大小
  2. Arduino编程之Serial.println()和Serial.print()
  3. 怎么把python模型部署到线上_如何将机器学习模型成功部署到.Net环境中
  4. html5日程管理系统,有条不紊:四款桌面日程管理软件横测
  5. 【Vue.js 知识量化】ES6 语法积累
  6. 搞机器学习还敲什么代码
  7. [Data Pump]impdp导入笔记
  8. 查看google chrome版本号及浏览器驱动下载
  9. ES6 = 函数参数
  10. 蓝桥杯“基础练习: 十六进制转十进制
  11. 解决git clone时报错fatal: HTTP request failed
  12. java中的http请求的封装(GET、POST、form表单形式)
  13. 【数据结构系列】严蔚敏C语言版算法实现并附带详细注释(逐步更新)
  14. “2021云管和云网大会”在京召开
  15. pandas daraframe 写入读取excel文件,并简单计算
  16. MySQL Bug一例-----ibuf cursor restoration fails
  17. 【Mqtt】基于paho.mqtt.c库的mqtt客户端实现
  18. 程序员面试必备软技能,值得收藏!
  19. 九度OJ——1023Excel排序
  20. 股票实时数据接口软件的数据来源是哪里?

热门文章

  1. 火影专场:Redis分布式锁实战
  2. 【单片机】电子音乐播放器的设计与制作(说明书)
  3. 「儒系」产品经理:管理预期,做好增长的3个核心要素
  4. Urlencode编码对HTTP的URL地址的作用的探究(20210519更新,最终结论得出,XSS相关)
  5. 华为外包项目的测试流程
  6. 企业支付宝开放平台入驻失败解决方案
  7. 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)
  8. Linux安装云原生网关Kong/KongA
  9. 数字杭电之抢课系统分析
  10. 【08】jQuery:01-jQuery介绍、jQuery基本使用、jQuery选择器、jQuery样式操作、jQuery效果、jQuery入口函数、jQuery对象