基于POI和DOM4将Excel(2007)文档写进Xml文件
刚进公司的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]
package polproject; import java.io.File; 
 import java.io.FileWriter;
 import java.util.ArrayList;
 import java.util.List; import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.DateUtil;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.dom4j.Document;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.XMLWriter; public class ExcelToXml { /**
 * @param args
 */
 public static void main(String[] args) throws Exception { toXml("D:/excel/system.xlsx", "D:/excel/system.xml");
 } /**
 * excel to xml
 */
 public static void toXml(String sourcePath, String targetPath) throws Exception { // 输出格式化
 final OutputFormat format = OutputFormat.createPrettyPrint();
 format.setEncoding("UTF-8"); // 指定XML编码
 final XMLWriter output = new XMLWriter(new FileWriter(targetPath), format); // 使用DocumentHelper.createDocument方法建立一个文档实例
 final Document document = DocumentHelper.createDocument();
 Element rootElm = document.getRootElement(); final File file = new File(sourcePath);
 final String fileName = file.getName(); // 如果想获得不带点的后缀,变为fileName.lastIndexOf(".")+1
 final String prefix = fileName.substring(fileName.lastIndexOf(".")); // 得到后缀名长度
 final int prefix_num = prefix.length(); // 得到文件名。去掉了后缀
 final String fileOtherName = fileName.substring(0, fileName.length() - prefix_num); if (rootElm == null) {
 // 创建根节点
 rootElm = document.addElement(fileOtherName);
 rootElm.addAttribute("pistion", fileName);
 }
 final Workbook wb = WorkbookFactory.create(new File(sourcePath));
 final int sheetNum = wb.getNumberOfSheets();
 for (int i = 0; i < sheetNum; i++) {
 final Sheet sheet = wb.getSheetAt(i); // 标记是否接下来的是否为fieldIdLabel
 boolean isFieldIdLabel = false;
 boolean isFieldValue = false;
 int coloumNum = 0;
 final List<String> fields = new ArrayList<String>();
 final String sheetName = sheet.getSheetName(); // 1#添加一级节点
 final Element firstElm = rootElm.addElement("sheet");
 firstElm.addAttribute("id",sheetName);
 firstElm.addAttribute("position",fileName+ "," +sheetName);
 Element secondElm = null;
 Element thirdElm = null;
 for (final Row row : sheet) {
 coloumNum = row.getPhysicalNumberOfCells(); Element fourthElm = null;
 boolean isNextRow = true;
 for (final Cell cell : row) { final String cellStr = cellValueToString(cell); // 2#添加二级节点
 if (cellStr.startsWith("##")) {
 final String cellElm = cellStr.substring(2);
 secondElm = firstElm.addElement(cellElm);
 secondElm.addAttribute("position", fileName + "," + sheetName +"," +String.valueOf(row.getRowNum()+1)); // 3#添加三级节点
 } else if (cellStr.startsWith("#begin")) {
 thirdElm = secondElm.addElement("elements");
 final String[] arrayStr = cellStr.split(":");
 if (arrayStr.length == 1) {
 thirdElm.addAttribute("id", "default");
 isFieldIdLabel = true;
 } else {
 thirdElm.addAttribute("pistion", arrayStr[1]);
 isFieldIdLabel = true;
 } // 4#收集添加四级节点
 } else if (isFieldIdLabel) {
 //如果不为空,则列数-1,并把头部加进fields里
 if( !cellStr.isEmpty()){
 if (coloumNum != 0) {
 fields.add(cellStr);
 coloumNum=coloumNum-1;
 }
 if (coloumNum == 0) {
 isFieldIdLabel = false;
 isFieldValue = true;
 }
 }else{//如果为空,则列数就只-1
 if (coloumNum != 0) {
 coloumNum=coloumNum-1;
 }
 if (coloumNum == 0) {
 isFieldIdLabel = false;
 isFieldValue = true;
 }
 } } else if (cellStr.startsWith("#end")) {
 isFieldValue = false;
 fields.clear();
 // 5#写入filedvalue
 } else if (isFieldValue) { if (isNextRow) {
 fourthElm = thirdElm.addElement("element");
 fourthElm.addAttribute("position", fileName + "," +sheetName +"," +String.valueOf(row.getRowNum()+1));
 final int celIndex = cell.getColumnIndex();
 Element fifthElm=null;
 if(fields.get(celIndex).lastIndexOf("*")>0){
 fifthElm = fourthElm.addElement(fields.get(celIndex).substring(0,fields.get(celIndex).indexOf("*")));
 }else{
 fifthElm = fourthElm.addElement(fields.get(celIndex));
 } fifthElm.setText(cellStr);
 isNextRow = false;
 } else {
 final int celIndex = cell.getColumnIndex();
 Element fifthElm=null;
 if (celIndex < fields.size()) {
 if(fields.get(celIndex).lastIndexOf("*")>0){
 fifthElm = fourthElm.addElement(fields.get(celIndex).substring(0,fields.get(celIndex).indexOf("*")-1));
 }else{
 fifthElm = fourthElm.addElement(fields.get(celIndex));
 }
 fifthElm.setText(cellStr);
 }
 }
 } else {
 // System.out.println(coloumNum + " " + isFieldIdLabel);
 }
 }
 }
 }
 System.out.println("end---------------------");
 output.write(document);
 output.flush();
 output.close();
 } /**
 * 将单元格的内容全部转换成字符串
 */
 private static String cellValueToString(Cell cell) {
 String str = "";
 switch (cell.getCellType()) {
 case Cell.CELL_TYPE_STRING:
 str = cell.getRichStringCellValue().getString();
 break;
 case Cell.CELL_TYPE_NUMERIC:
 if (DateUtil.isCellDateFormatted(cell)) {
 str = cell.getDateCellValue().toString();
 } else {
 str = String.valueOf(cell.getNumericCellValue());
 }
 break;
 case Cell.CELL_TYPE_BOOLEAN:
 str = String.valueOf(cell.getBooleanCellValue());
 break;
 case Cell.CELL_TYPE_FORMULA:
 str = cell.getCellFormula();
 break;
 default:
 // System.out.println("can not format cell value :" + cell.getRichStringCellValue());
 str = cell.getRichStringCellValue().getString();
 break;
 }
 return str;
 }
 }
结果图:
基于POI和DOM4将Excel(2007)文档写进Xml文件的更多相关文章
- Java小知识----POI事件模式读取Excel 2007
		一.知识背景 1.读取excel的方法选择问题 java中读excel中的时间,我们通常用POI去解析,在使用new HSSFWorkbook(NEW FileInputStream(excelFil ... 
- 使用 Apache FOP 2.3 + docbook-xsl-ns-1.79.1 转换 Docbook 5.1 格式的 XML 文档成 PDF/RTF 文件
		使用 Docbook 编写折桂打印平台系统.折桂上传平台系统的产品文档,原因基于如下两点: 第一,文档的不同章节,可使用不同的 .xml 文件,由不同人员分别撰写,图片文件在XML文章中用相对目录方式 ... 
- C#生成PDF文档,读取TXT文件内容
		using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.d ... 
- 【HTML/XML 10】XML文档中的Schema文件
		导读:DTD是对XML文档进行有效性验证的方法之一,事实上,继DTD之后,出现了用来规范和描述XML文档的第二代标准:Schema.Schema是DTD的继承,但是也有其不同的地方,它是真正的以独立的 ... 
- UINavigationController 导航控制器 ,根据文档写的一些东西
		今天讲了导航控制器UINavigationController 和标签栏视图控制器UITabBarController 先来说一说导航视图控制器 UINavigationController 导航控 ... 
- 判断pdf、word文档、图片等文件类型(格式)、大小的简便方法
		判断pdf.word文档.图片等文件类型(格式).大小的简便方法 很久没发文了,今天有时间就写一下吧. 关于上传文件,通常我们都需要对其进行判断,限制上传的类型,如果是上传图片,我们甚至会把图片转化成 ... 
- WPF:将Office文档、任意类型文件嵌入到EXE可执行文件中
		原文:WPF:将Office文档.任意类型文件嵌入到EXE可执行文件中 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei198 ... 
- 【XML】利用Dom4j读取XML文档以及写入XML文档
		Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ... 
- java合并多个word 2007 文档 基于docx4j
		参考文章:http://dh.swzhinan.com/post/185.html 引入的jar包 <dependency> <groupId>org.docx4j</g ... 
随机推荐
- [全排列]--A Number Puzzle
			标签: ACM Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间. 这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两 ... 
- npm常用命令整理
			npm是一个NodeJS包管理跟分发工具,已经成为了非官方的发布node模块(包)的标准.它可以帮助我们解决代码部署上的一些问题,将开发者从繁琐的包管理工作中(版本.依赖等)解放出来,更加专注于功能上 ... 
- linux grep 从入门到精通
			linux grep 从入门到精通 一.初级 搜索日志 grep "186" catalina.out 在新输出日志中监听固定字符串 tail -f catalina.out | ... 
- 服务器获取浏览器发送请求中的cookies,选取自己需要的cookie
			String cookieName = “userID”; // 设置自己需要的cookie名 Cookie cookies[] = request.getCookies(); // 获取请求中的所有 ... 
- Linux下RabbitMq安装
			在大多数大公司,像应用服务器软件的安装.部署都是运维的事情,其实自己去尝试部署一下,也是有收获的. 有机会正好尝试了Linux下的rabbitMq安装过程,做了记录,希望有用到的人可以做下参考. 安装 ... 
- PHPstorm 如何新增项目
			如何在PHPstorm新增项目 1.打开设置 2.找到Directories ,点击增加路径 
- Prism for WPF初探(构建简单的模块化开发框架)
			先简单的介绍一下Prism框架,引用微软官方的解释: Prism provides guidance to help you more easily design and build, flexibl ... 
- json数据导出excel
			最近做的一个项目涉及到把数据导出到excel里面,网上找来找去,最终找到两种办法,废话不多说了 第一种: 拿到表格的id就可以抓取表格的数据,导出到excel,这种方式简单粗暴,引入这两个插件即可. ... 
- java实现导出Excel(跨行,跨列)
			先来个最终结果样式: 第一步: 传参,后期可根据自己需要进行调整.我这里需要的是 quarter 代表季度 dptid 部门编号根据接受过来的参数进行文档命名. UserInfo userInfo=( ... 
- 【zabbix系列】安装与加入host
			測试环境 Ubuntu 14.04.1 LTS [服务端安装] 关于安装官方提供了非常具体的安装方法,包含各平台的源代码及包安装.关于其它版本号Linux请參考 https://www.zabbix. ... 
