文档章节

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

春天花会开foryou
 春天花会开foryou
发布于 2017/05/04 13:55
字数 971
阅读 130
收藏 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
粉丝 33
博文 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
MyBatis框架教程「入门起步」

今天我们就踏上学习Mybatis框架的旅程,在SSM框架中Mybatis框架是dao层的一个解决方案。相当于传统Servlet+JavaBean开发模式中JDBC的作用。具体关于MVC架构的知识可以移步「从零学习Spring ...

技术小能手
07/30
0
0
Java程序员必读书单,家族又添新成员

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

异步社区
05/09
0
0
Java微信开发_00_资源汇总贴

1.微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) 2.微信企业号开发接口文档(http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E......

rayner
2017/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

window.parent,top,window.self,parent,opener

在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法打开当前窗口的那个窗口。 wind...

inidcard
1分钟前
1
0
Linux下Redis的安装和部署

一、Redis介绍 Redis是当前比较热门的NOSQL系统之一 它是一个key-value存储系统。和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括string、list、set...

曾大大胖
4分钟前
1
0
开源堡垒机jumpserver搭建

概述 之前说了国产良心kodexplorer,今天再说一个国内比较好的开源项目jumpserver,除此之外还可以的国内开源项目我觉得就是宝塔面板了。废话不多说上教程搭建。 虽然说你可以看下面的教程不...

bboysoulcn
10分钟前
1
0
iPhoneX 底部距离

iPhoneX 底部距离 CGFloat adjust = 0; if (@available(iOS 11.0, *)) { //Account for possible notch UIEdgeInsets safeArea = [[UIApplication sharedApplication] keyWindow].safeAreaIn......

壹峰
14分钟前
2
0
养生篇01 (饭水分离法)

作者简介❤李祥文,1939年出生于韩国庆尚北道尚州市成昌邑。 24岁时,偶遇奇人习得这种分别喝水吃饭的养生方法,从而治好了自己的胃病和哮喘。从此,李祥文对饮食之于人体的影响产生了极大的...

十九亿少女的梦
29分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部