刚进公司的training, 下面是要求:

Requirements

  • Write a java program to read system.xlsx
  • Use POI API to parse all contents in the excel
  • Write all contents to an output file
  • The file should in XML format(optional)
  • The program can start with a bat command(optional)

Reference

  • POI official site -- http://poi.apache.org/    ---下载poi相关的包
  • CBX-Builder implementation -- \\triangle\share\git\training\CBX_Builder [develop branch]
    1. package polproject;
    2.  
    3. import java.io.File;
    4. import java.io.FileWriter;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7.  
    8. import org.apache.poi.ss.usermodel.Cell;
    9. import org.apache.poi.ss.usermodel.DateUtil;
    10. import org.apache.poi.ss.usermodel.Row;
    11. import org.apache.poi.ss.usermodel.Sheet;
    12. import org.apache.poi.ss.usermodel.Workbook;
    13. import org.apache.poi.ss.usermodel.WorkbookFactory;
    14. import org.dom4j.Document;
    15. import org.dom4j.DocumentHelper;
    16. import org.dom4j.Element;
    17. import org.dom4j.io.OutputFormat;
    18. import org.dom4j.io.XMLWriter;
    19.  
    20. public class ExcelToXml {
    21.  
    22. /**
    23. * @param args
    24. */
    25. public static void main(String[] args) throws Exception {
    26.  
    27. toXml("D:/excel/system.xlsx", "D:/excel/system.xml");
    28. }
    29.  
    30. /**
    31. * excel to xml
    32. */
    33. public static void toXml(String sourcePath, String targetPath) throws Exception {
    34.  
    35. // 输出格式化
    36. final OutputFormat format = OutputFormat.createPrettyPrint();
    37. format.setEncoding("UTF-8"); // 指定XML编码
    38. final XMLWriter output = new XMLWriter(new FileWriter(targetPath), format);
    39.  
    40. // 使用DocumentHelper.createDocument方法建立一个文档实例
    41. final Document document = DocumentHelper.createDocument();
    42. Element rootElm = document.getRootElement();
    43.  
    44. final File file = new File(sourcePath);
    45. final String fileName = file.getName();
    46.  
    47. // 如果想获得不带点的后缀,变为fileName.lastIndexOf(".")+1
    48. final String prefix = fileName.substring(fileName.lastIndexOf("."));
    49.  
    50. // 得到后缀名长度
    51. final int prefix_num = prefix.length();
    52.  
    53. // 得到文件名。去掉了后缀
    54. final String fileOtherName = fileName.substring(0, fileName.length() - prefix_num);
    55.  
    56. if (rootElm == null) {
    57. // 创建根节点
    58. rootElm = document.addElement(fileOtherName);
    59. rootElm.addAttribute("pistion", fileName);
    60. }
    61. final Workbook wb = WorkbookFactory.create(new File(sourcePath));
    62. final int sheetNum = wb.getNumberOfSheets();
    63. for (int i = 0; i < sheetNum; i++) {
    64. final Sheet sheet = wb.getSheetAt(i);
    65.  
    66. // 标记是否接下来的是否为fieldIdLabel
    67. boolean isFieldIdLabel = false;
    68. boolean isFieldValue = false;
    69. int coloumNum = 0;
    70. final List<String> fields = new ArrayList<String>();
    71. final String sheetName = sheet.getSheetName();
    72.  
    73. // 1#添加一级节点
    74. final Element firstElm = rootElm.addElement("sheet");
    75. firstElm.addAttribute("id",sheetName);
    76. firstElm.addAttribute("position",fileName+ "," +sheetName);
    77. Element secondElm = null;
    78. Element thirdElm = null;
    79. for (final Row row : sheet) {
    80. coloumNum = row.getPhysicalNumberOfCells();
    81.  
    82. Element fourthElm = null;
    83. boolean isNextRow = true;
    84. for (final Cell cell : row) {
    85.  
    86. final String cellStr = cellValueToString(cell);
    87.  
    88. // 2#添加二级节点
    89. if (cellStr.startsWith("##")) {
    90. final String cellElm = cellStr.substring(2);
    91. secondElm = firstElm.addElement(cellElm);
    92. secondElm.addAttribute("position", fileName + "," + sheetName +"," +String.valueOf(row.getRowNum()+1));
    93.  
    94. // 3#添加三级节点
    95. } else if (cellStr.startsWith("#begin")) {
    96. thirdElm = secondElm.addElement("elements");
    97. final String[] arrayStr = cellStr.split(":");
    98. if (arrayStr.length == 1) {
    99. thirdElm.addAttribute("id", "default");
    100. isFieldIdLabel = true;
    101. } else {
    102. thirdElm.addAttribute("pistion", arrayStr[1]);
    103. isFieldIdLabel = true;
    104. }
    105.  
    106. // 4#收集添加四级节点
    107. } else if (isFieldIdLabel) {
    108. //如果不为空,则列数-1,并把头部加进fields里
    109. if( !cellStr.isEmpty()){
    110. if (coloumNum != 0) {
    111. fields.add(cellStr);
    112. coloumNum=coloumNum-1;
    113. }
    114. if (coloumNum == 0) {
    115. isFieldIdLabel = false;
    116. isFieldValue = true;
    117. }
    118. }else{//如果为空,则列数就只-1
    119. if (coloumNum != 0) {
    120. coloumNum=coloumNum-1;
    121. }
    122. if (coloumNum == 0) {
    123. isFieldIdLabel = false;
    124. isFieldValue = true;
    125. }
    126. }
    127.  
    128. } else if (cellStr.startsWith("#end")) {
    129. isFieldValue = false;
    130. fields.clear();
    131. // 5#写入filedvalue
    132. } else if (isFieldValue) {
    133.  
    134. if (isNextRow) {
    135. fourthElm = thirdElm.addElement("element");
    136. fourthElm.addAttribute("position", fileName + "," +sheetName +"," +String.valueOf(row.getRowNum()+1));
    137. final int celIndex = cell.getColumnIndex();
    138. Element fifthElm=null;
    139. if(fields.get(celIndex).lastIndexOf("*")>0){
    140. fifthElm = fourthElm.addElement(fields.get(celIndex).substring(0,fields.get(celIndex).indexOf("*")));
    141. }else{
    142. fifthElm = fourthElm.addElement(fields.get(celIndex));
    143. }
    144.  
    145. fifthElm.setText(cellStr);
    146. isNextRow = false;
    147. } else {
    148. final int celIndex = cell.getColumnIndex();
    149. Element fifthElm=null;
    150. if (celIndex < fields.size()) {
    151. if(fields.get(celIndex).lastIndexOf("*")>0){
    152. fifthElm = fourthElm.addElement(fields.get(celIndex).substring(0,fields.get(celIndex).indexOf("*")-1));
    153. }else{
    154. fifthElm = fourthElm.addElement(fields.get(celIndex));
    155. }
    156. fifthElm.setText(cellStr);
    157. }
    158. }
    159. } else {
    160. // System.out.println(coloumNum + " " + isFieldIdLabel);
    161. }
    162. }
    163. }
    164. }
    165. System.out.println("end---------------------");
    166. output.write(document);
    167. output.flush();
    168. output.close();
    169. }
    170.  
    171. /**
    172. * 将单元格的内容全部转换成字符串
    173. */
    174. private static String cellValueToString(Cell cell) {
    175. String str = "";
    176. switch (cell.getCellType()) {
    177. case Cell.CELL_TYPE_STRING:
    178. str = cell.getRichStringCellValue().getString();
    179. break;
    180. case Cell.CELL_TYPE_NUMERIC:
    181. if (DateUtil.isCellDateFormatted(cell)) {
    182. str = cell.getDateCellValue().toString();
    183. } else {
    184. str = String.valueOf(cell.getNumericCellValue());
    185. }
    186. break;
    187. case Cell.CELL_TYPE_BOOLEAN:
    188. str = String.valueOf(cell.getBooleanCellValue());
    189. break;
    190. case Cell.CELL_TYPE_FORMULA:
    191. str = cell.getCellFormula();
    192. break;
    193. default:
    194. // System.out.println("can not format cell value :" + cell.getRichStringCellValue());
    195. str = cell.getRichStringCellValue().getString();
    196. break;
    197. }
    198. return str;
    199. }
    200. }

结果图:

基于POI和DOM4将Excel(2007)文档写进Xml文件的更多相关文章

  1. Java小知识----POI事件模式读取Excel 2007

    一.知识背景 1.读取excel的方法选择问题 java中读excel中的时间,我们通常用POI去解析,在使用new HSSFWorkbook(NEW FileInputStream(excelFil ...

  2. 使用 Apache FOP 2.3 + docbook-xsl-ns-1.79.1 转换 Docbook 5.1 格式的 XML 文档成 PDF/RTF 文件

    使用 Docbook 编写折桂打印平台系统.折桂上传平台系统的产品文档,原因基于如下两点: 第一,文档的不同章节,可使用不同的 .xml 文件,由不同人员分别撰写,图片文件在XML文章中用相对目录方式 ...

  3. C#生成PDF文档,读取TXT文件内容

    using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.d ...

  4. 【HTML/XML 10】XML文档中的Schema文件

    导读:DTD是对XML文档进行有效性验证的方法之一,事实上,继DTD之后,出现了用来规范和描述XML文档的第二代标准:Schema.Schema是DTD的继承,但是也有其不同的地方,它是真正的以独立的 ...

  5. UINavigationController 导航控制器 ,根据文档写的一些东西

    今天讲了导航控制器UINavigationController 和标签栏视图控制器UITabBarController 先来说一说导航视图控制器  UINavigationController 导航控 ...

  6. 判断pdf、word文档、图片等文件类型(格式)、大小的简便方法

    判断pdf.word文档.图片等文件类型(格式).大小的简便方法 很久没发文了,今天有时间就写一下吧. 关于上传文件,通常我们都需要对其进行判断,限制上传的类型,如果是上传图片,我们甚至会把图片转化成 ...

  7. WPF:将Office文档、任意类型文件嵌入到EXE可执行文件中

    原文:WPF:将Office文档.任意类型文件嵌入到EXE可执行文件中 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei198 ...

  8. 【XML】利用Dom4j读取XML文档以及写入XML文档

    Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...

  9. java合并多个word 2007 文档 基于docx4j

    参考文章:http://dh.swzhinan.com/post/185.html 引入的jar包 <dependency> <groupId>org.docx4j</g ...

随机推荐

  1. thinkphp使用foreach遍历的方法

    我们在做一些需求的时候可能会对遍历的上限有一定的要求,这时候就需要对上限进行限定 首先使用foreach遍历的输出数组相比较于volist功能较少 volist标签主要用于在模板中循环输出数据集或者多 ...

  2. Innodb中的锁

    Innodb中的锁 共享锁和排它锁(Shared and Exclusive Locks)共享锁和排它锁是行级锁,有两种类型的行级锁 共享锁(s lock)允许持有锁的事务对行进行读取操作 排它锁(x ...

  3. 使用JSCH框架通过跳转机访问其他节点

    之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务.在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API.但是看的云里雾里的.联想了下,端口转发的原 ...

  4. 项目实战6—Mysql实现企业级日志管理、备份与恢复实战

    Mysql实现企业级日志管理.备份与恢复实战 环境背景:随着业务的发展,公司业务和规模不断扩大,网站积累了大量的用户信息和数据,对于一家互联网公司来说,用户和业务数据是根基.一旦公司的数据错乱或者丢失 ...

  5. 【NOIP2009提高组】最优贸易

    https://www.luogu.org/problem/show?pid=1073 如果他想在i点卖出,那么就要在从1点出发到i点的路径里找个最便宜的买入,用Bellman-Ford求出这样最便宜 ...

  6. svn文件回滚到某个历史版本号

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/50819642 本文出自[我是干勾鱼的博客] 有时候想要将svn中的某个文件回滚到 ...

  7. 回溯法之求n个集合的幂集

    幂集:有一个集合A,集合A的幂集是由集合A的全部子集所组成的集合. 集合中的每一个元素仅仅有两种状态:属于幂集的元素集或不属于幂集的元素集. 集合{1,2,3},用一棵二叉树来表示. 递归函数 voi ...

  8. Javascript实现简单的下拉二级菜单

    在线演示;http://jsfiddle.net/Web_Code/ThhbG/embedded/result/ <span style="font-size:14px;"& ...

  9. 天津政府应急系统之GIS一张图(arcgis api for flex)解说(三)显示地图坐标系模块

    config.xml文件的配置例如以下: 1 2 <widget left="3" bottom="3" config="widgets/Coo ...

  10. C语言可变參函数的实现

    1 C语言中函数调用的原理 函数是大多数编程语言都实现的编程要素.调用函数的实现原理就是:运行跳转+參数传递.对于运行跳转,全部的CPU都直接提供跳转指令:对于參数传递,CPU会提供多种方式.最常见的 ...