基于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 ...
随机推荐
- thinkphp使用foreach遍历的方法
我们在做一些需求的时候可能会对遍历的上限有一定的要求,这时候就需要对上限进行限定 首先使用foreach遍历的输出数组相比较于volist功能较少 volist标签主要用于在模板中循环输出数据集或者多 ...
- Innodb中的锁
Innodb中的锁 共享锁和排它锁(Shared and Exclusive Locks)共享锁和排它锁是行级锁,有两种类型的行级锁 共享锁(s lock)允许持有锁的事务对行进行读取操作 排它锁(x ...
- 使用JSCH框架通过跳转机访问其他节点
之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务.在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API.但是看的云里雾里的.联想了下,端口转发的原 ...
- 项目实战6—Mysql实现企业级日志管理、备份与恢复实战
Mysql实现企业级日志管理.备份与恢复实战 环境背景:随着业务的发展,公司业务和规模不断扩大,网站积累了大量的用户信息和数据,对于一家互联网公司来说,用户和业务数据是根基.一旦公司的数据错乱或者丢失 ...
- 【NOIP2009提高组】最优贸易
https://www.luogu.org/problem/show?pid=1073 如果他想在i点卖出,那么就要在从1点出发到i点的路径里找个最便宜的买入,用Bellman-Ford求出这样最便宜 ...
- svn文件回滚到某个历史版本号
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/50819642 本文出自[我是干勾鱼的博客] 有时候想要将svn中的某个文件回滚到 ...
- 回溯法之求n个集合的幂集
幂集:有一个集合A,集合A的幂集是由集合A的全部子集所组成的集合. 集合中的每一个元素仅仅有两种状态:属于幂集的元素集或不属于幂集的元素集. 集合{1,2,3},用一棵二叉树来表示. 递归函数 voi ...
- Javascript实现简单的下拉二级菜单
在线演示;http://jsfiddle.net/Web_Code/ThhbG/embedded/result/ <span style="font-size:14px;"& ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)解说(三)显示地图坐标系模块
config.xml文件的配置例如以下: 1 2 <widget left="3" bottom="3" config="widgets/Coo ...
- C语言可变參函数的实现
1 C语言中函数调用的原理 函数是大多数编程语言都实现的编程要素.调用函数的实现原理就是:运行跳转+參数传递.对于运行跳转,全部的CPU都直接提供跳转指令:对于參数传递,CPU会提供多种方式.最常见的 ...