文档章节

excel转xml--《从头搭建Java游戏服务器》(一)

春天花会开foryou
 春天花会开foryou
发布于 2017/05/04 13:55
字数 971
阅读 109
收藏 0
点赞 0
评论 0

关键字 xls转xml  xlsx转xml

 

excel对策划配置很友好,一般做为游戏的通用配置方式,但是excel文件在程序读取的时候,有一定的不方便之处:

1 excel的修改无法进行比较,程序员不知道策划每次修改了什么

2 excel读取较xml慢2倍,导致服务器启动较慢

 

本文介绍excel对xls及xlsx的转换

 

一 格式介绍

excel的格式:

 

多页或单页excel,第一行为th,表头,第二行为注释

 

xml的格式:

xml为单行xml,xml表现形式丰富,可以表现多层嵌套结构,如果excel表格规范,建议设置为单行,便于阅读

 

二 需要类包

<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

选用jdom解析xml,poi解析excel,下文会介绍用jxl解析excel

 

三 Poi 

 

首先在D盘建立 excelToXml文件夹,把所需要转换的excel放在文件里,在excelToXml下建立 xml文件夹

 

package xlsToXml;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
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.xssf.usermodel.XSSFWorkbook;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * @author dafeng
 */
public class PoiXlsAndXlsxToXml {

	/**
	 * @param path
	 *            文件夹目录
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static void write(String path) throws FileNotFoundException, IOException {
		List<String> filelist = FileUtils.getFiles(path, ".xls", ".xlsx");
		for (String fileName : filelist) {
			// 工作簿
			Workbook wb = null;
			InputStream instream = new FileInputStream(fileName);
			try {
				// 兼容xls和xlsx
				if (fileName.endsWith(".xls")) {
					wb = new HSSFWorkbook(instream);
				} else {
					wb = new XSSFWorkbook(instream);
				}
				// 获得所有的Sheet
				Iterator<Sheet> it = wb.sheetIterator();
				while (it.hasNext()) {
					Sheet sheet = it.next();
					// 对Sheet的名字进行判断,只接收数字,英文,下划线和短横
					if (!isLetterDigit(sheet.getSheetName())) {
						continue;
					}
					System.out.println("正在生成" + fileName + "_" + sheet.getSheetName());
					// 建立根节点
					Element root = new Element("root");
					// 根节点添加到文档
					Document document = new Document(root);
					// 取出第一行(用来获取表头)
					Row rowTh = sheet.getRow(0);
					// 取得行数
					int rowNum = sheet.getLastRowNum();
					for (int i = 1; i <= rowNum; i++) {
						// 针对每一行建立元素
						Element elements = new Element("tr");
						Row row = sheet.getRow(i);
						int cellNum = 0;
						if (i == 1)
							continue;
						for (Cell cell : row) {
							// 取得表头
							String th = getValue(rowTh.getCell(cellNum));
							// 如果没有表头,跳过
							if ("".equals(th))
								continue;
							// 填写元素的属性
							elements.setAttribute(th, getValue(cell));
							root.addContent(elements.detach());
							cellNum++;
						}
					}
					// 设置XML的排版方式
					Format format = Format.getPrettyFormat();
					XMLOutputter XMLOut = new XMLOutputter(format);
					// 拼接输出文件名字,输出文件
					int index = fileName.lastIndexOf("\\");
					XMLOut.output(document,
							new FileOutputStream(fileName.substring(0, index) + "\\xml\\"
									+ fileName.substring(index, fileName.length()) + "_" + sheet.getSheetName()
									+ ".xml"));
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 由于poi输出的内容都自带类型,所以要进行转换
	 * 
	 * @param cell
	 *            格子
	 * @return 格子的String格式的内容
	 */
	public static String getValue(Cell cell) {
		CellType type = cell.getCellTypeEnum();
		switch (type) {
		case _NONE:
		case BLANK:
			return "";
		case NUMERIC:
			// poi对数字统一处理为double类型,会让填写的1变为1.0,此处做手动处理
			double doubleVal = cell.getNumericCellValue();
			long longVal = Math.round(cell.getNumericCellValue());
			if (Double.parseDouble(longVal + ".0") == doubleVal) {
				return String.valueOf((int) doubleVal);
			} else {
				return String.valueOf(doubleVal);
			}
		case BOOLEAN:
			return String.valueOf(cell.getBooleanCellValue());
		default:
			return String.valueOf(cell.getStringCellValue());
		}
	}

	public static boolean isLetterDigit(String str) {
		String regex = "^[a-z0-9A-Z_-]+$";// 指定sheetName只能包括数字,字母,下划线和短横
		// \u4e00-\u9fa5 这是汉字
		return str.matches(regex);
	}

	public static void main(String[] args) throws FileNotFoundException, IOException, JDOMException {
		// 指定文件夹路径
		write("D:\\excelToXml");
	}
}

 

 

FileUtils

 

package xlsToXml;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;

public class FileUtils {
	public static List<String> getFiles(String filePath, final String... endsWith) {
		File root = new File(filePath);
		File[] files = root.listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				String name = pathname.getName();
				for (String end : endsWith) {
					if (name.endsWith(end))
						return true;
				}
				return false;
			}
		});
		 List<String> filelist = new ArrayList<>();
		 for (File file : files) {
			 if (file.isDirectory()) {
				 getFiles(file.getAbsolutePath(), endsWith);
				 System.out.println( filePath + "所有子目录及文件" +file.getAbsolutePath());
			 } else {
				 filelist.add(file.getAbsolutePath());
				 System.out.println( filePath + "子目录" +file.getAbsolutePath());
			 }
		 }
		return filelist;
	}
}

 

四 读取

 

	public static void read(String path) throws JDOMException, IOException {
		File file = new File(path);
		SAXBuilder s = new SAXBuilder();
		Document d = s.build(file);
		Element root = d.getRootElement();
		Iterator<Element> it = root.getChildren().<Element> iterator();
		while (it.hasNext()) {
			Element e = it.next();
			List l = e.getAttributes();
			for (int i = 0; i < l.size(); i++) {
				Attribute a = (Attribute) l.get(i);
				System.out.println(a.getName() + "_" + a.getValue());
			}

		}
	}

	public static void main(String[] args) throws FileNotFoundException, IOException, JDOMException {
		String path = "D:\\excelToXml\\xml\\Equip.xlsx_Equip.xml";
		read(path);
	}

输出

id_1
type_1
price_100.01
id_2
type_2
price_389
id_3
type_3
price_231
id_4
type_2
price_432

 

excel的读取转换,xml的输出介绍到这里

© 著作权归作者所有

共有 人打赏支持
春天花会开foryou
粉丝 26
博文 3
码字总数 1998
作品 0
东城
程序员
推荐6款常用的Java开源报表制作工具

1.JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其他IDE报表工具一样来制作报表。JasperReports支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发...

李长春
2012/02/09
0
0
Centos下安装类百度文库环境

使用php实现百度文库功能,网上搜索到的方案,实现doc转pdf,pdf转swf,然后显示出来。 这里简单的记录下,【doc转pdf,pdf转swf】两个功能的搭建流程。 doc转pdf 使用到下列程序(文件): Ap...

DragonFK
2013/02/20
0
1
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0
Spring Boot实践--集成WebServices基础开发

Spring Boot实践--集成Web Services基础开发 Spring Web Services(下简称ws)本质上是基于SpringBoot的项目,因此如果有对SpringBoot不太了解的同学,回头再来看比较合适。 ws分为server端与c...

spinachgit
02/01
0
0
JavaWeb应用常见故障以及处理方法

服务器架构为: Nginx+resin+memcached+db 一、故障原因 1、服务器负载高 (1)访问量突增 (2)代码逻辑问题 (3)部分服务失效(ATS,DB,MC......) PS:Linux服务器负载一般在2以下。 2、Dir...

NovaWong
2015/01/08
0
0
搭建Java Web项目问题总结

1.Target runtime com.genuitec.runtime.generic.jee60 is not defined. 解决方案是:在工程目录下的.settings文件夹里,打开org.eclipse.wst.common.project.facet.core.xml文件,其内容为: <......

xuesong13
2015/01/27
0
1
以XML为中间文档格式的Excel电子表格向SVG图转换

引 言 随着办公自动化、电子政务的发展,无纸化办公已是大势所趋。当前主流的文档格式有: Microsoft Office, OpenOffice, PDF 等。其中企业的统计数据、内部报表多以Excel 电子表格 来呈现。...

webas
2013/04/16
0
0
在tomcat下context.xml中配置各种数据库连接池(转)

Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下。我们可以在这里找到 server.xml 和 context.xml。当然,还有其他一些资源文件。但是在在本文中我们只用得上这两个,其他的就不介绍了...

徐龙
2012/07/02
0
4
分享一个简单易用的RPC开源项目—Tatala

这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务。后来不断增加新的功能,除了Java还支持C#,到现在已经可以用它来开发网络游戏的服务器。等过些...

zijan
2014/04/08
0
1
ABAP vs Java, 蛙泳 vs 自由泳

去年7月定下的一年之内学会自由泳的目标终于实现了,特来还愿。 ABAP和Java, 蛙泳和自由泳。前面的组合是Jerry用来挣钱养家的技术,后者是Jerry花了大量业余时间和金钱苦练的技能。或许有的朋...

JerryWang_SAP
07/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ES12-词项查询

1.词项查询介绍 全文查询将在执行之前分析查询字符串,但词项级别查询将按照存储在倒排索引中的词项进行精确操作。这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,...

贾峰uk
12分钟前
0
0
http状态码与ajax的状态值

ajax状态值 1.1 200 & OK:状态请求成功

litCabbage
15分钟前
0
0
iOS动画效果合集、飞吧企鹅游戏、换肤方案、画板、文字效果等源码

iOS精选源码 动画知识运用及常见动画效果收集 3D卡片拖拽卡片叠加卡片 iFIERO - FLYING PENGUIN 飞吧企鹅SpriteKit游戏(源码) Swift封装的空数据提醒界面EmptyView 沙盒文件浏览与分享调试控...

sunnyaigd
18分钟前
0
0
AngularJS配置.run()块中设置路由事件的监听器以及过滤未经授权的请求

AngularJS中的run方法初始化全局数据,只对全局作用域起作用,如$rootScope.多个控制器之间可以共享数据,如下代码所示: <script type="text/javascript"> var m1 = angular....

孟飞阳
19分钟前
0
0
Java语言学习(十):输入/输出

Java中,I/O操作代表着输入、输出,Java所有的I/O机制都是基于数据流进行输入输出。java.io类包提供了很多的输入输出处理功能方法,大家可以参考下JDK文档中关于I/O的一些处理方法:JDK在线中...

海岸线的曙光
28分钟前
0
0
基于阿里出得ng-Alain搭建后台管理系统

首先跟大家介绍一下ng_Alain(阿里团队出品) ng-alain技术栈基于 Typescript、Angular、g2、@delon 和 ng-zorro-antd,提前了解和学习这些知识会非常有帮助。 ng-alain 脚手架是基于 Angular ...

方宏春
32分钟前
1
0
Spring框架IOC和AOP的实现原理

一、IoC(Inversion of Control) (1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转...

HaierBrother
35分钟前
1
0
C++模版编程实现Haskell的函数模式匹配特性[图]

C++模版编程实现Haskell的函数模式匹配特性[图]: 大神 Bartosz Milewski 在2009年写了一篇文章《What Does Haskell Have to Do with C++?》,使用C++实现Haskell函数式编程语言的一些特性。...

原创小博客
36分钟前
1
0
${value}

1、就算 mapper 里面配置的名称是configSql ,在xml 里面配置的时候要注意 报错:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflectio......

职业搬砖20年
42分钟前
1
0
Xamarin 学习笔记 - Layout(布局)

本文翻译自CodeProject文章:https://www.codeproject.com/Articles/1227733/Xamarin-Notes-Xamarin-Forms-Layouts 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案...

葡萄城技术团队
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部