技术标签: java xlsx转xlsx
今天因为工作需要,需要写一个demo将xlsx转换成json数据。将store绑定在category里面。
数据如图:
然后就找到POI和fastjson的jar包。
demo:
public static void main(String[] args) throws IOException {
Xlsx xlsxMain = new Xlsx();
List list = new ArrayList();
HashMap map = xlsxMain.readXlsx();//读取xlsx
Set setIds = map.keySet();
Iterator i = setIds.iterator();
while(i.hasNext()){
int id = i.next();
Category category = map.get(id);
list.add(category);
}
Collections.sort(list);//排序
String json = JSON.toJSONString(list);//将list转换成json
File file = new File("D:\\json.txt");
FileOutputStream out = new FileOutputStream(file);//写入文件
byte[] bytes = json.getBytes();
out.write(bytes);
out.flush();
out.close();
}
private HashMap readXlsx() throws IOException {
String fileName = "D:\\m.xlsx";
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileName);
HashMap map = new HashMap();
//读取sheet
for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
if (xssfSheet == null) {
continue;
}
//读取行
for (int rowNum = 0; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
if (xssfRow == null) {
continue;
}
if (rowNum == 0) {
continue;
}
Store store = new Store();
Category category = null;
//读取列
for (int cellNum = 0; cellNum <= xssfRow.getLastCellNum(); cellNum++) {
XSSFCell xssfCell = xssfRow.getCell(cellNum);
if(xssfCell == null){
continue;
}
String xssCell = getValue(xssfCell);
if(cellNum == 0){
store.setId((int)Float.parseFloat(xssCell));
}else if(cellNum == 1){
store.setName(xssCell);
}else if(cellNum == 4){
int categoryId = Integer.parseInt(xssCell);
if(map.containsKey(categoryId)){
category = map.get(categoryId);
category.setCategoryId(categoryId);
category.addStore(store);
}else{
category = new Category();
category.setCategoryId(categoryId);
category.addStore(store);
map.put(categoryId, category);
}
}else if(cellNum == 5){
int p = xssCell.indexOf("/");
String b = p > 0? xssCell.substring(0, p) : xssCell;
b = b.toUpperCase();
category.setCategoryName(b);
}else if(cellNum ==6){
store.setBanner(xssCell);
}
}
}
}
return map;
}
//得到值
private String getValue(XSSFCell xssfCell) {
if (xssfCell.getCellType() == xssfCell.CELL_TYPE_BOOLEAN) {
return String.valueOf(xssfCell.getBooleanCellValue());
} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC) {
return String.valueOf(xssfCell.getNumericCellValue());
} else {
return String.valueOf(xssfCell.getStringCellValue());
}
}
}输出文本:
[{"categoryId":1,"categoryName":"DEPARTMENT STORES","stores":[{"banner":"http://upload.cheaperseeker.com/2014/02/5746e15389.png","id":2612,"name":"Kohls"},{"banner":"http://upload.cheaperseeker.com/2012/04/Macys.jpg","id":2845,"name":"Macy's"},{"banner":"http://upload.cheaperseeker.com/2012/08/logo_bbb.gif","id":557,"name":"Bed Bath & Beyond"},...}]
文章浏览阅读3.2k次。nagiosQL安装环境:CentOS release 6.4 (Final)php-5.5.4nagiosql_320nginx version: nginx/1.2.3 安装一切正常,当访问nagiosQL界面时会提示:PHP Deprecated: preg_replace(): The /e modifier is deprecat_php message: php deprecated
文章浏览阅读1.1k次。make[2]: Entering directory '/hisi/soft/board/Hi3516A_SDK_V1.0.7.0/osdrv/tools/pc/jffs2_tool/tmp/mtd-utils-2.0.1'make[2]: *** No targets specified and no makefile found. Stop.make[2]: Leaving dir_海思sdk里面的sample在make时出现链接错误
文章浏览阅读2.7k次。考虑一下这种场景,你开发了一个应用,它有十分优秀的布局设计,最新的特性以及其它的优秀特点。但是在性能这方面欠缺,不管这个应用如何都会遭到客户拒绝。客户总是期望它们的应用应该有更好的性能。如果你在产品中使用了Tomcat服务器,那么这篇文章就会给你几方面来提升Tomcat服务器的性能。感谢ITWorld article给本文提供资源。经过沉思我已经知道了和早期版本相比最新的Tomcat提供更好的_不设置xmx xms
文章浏览阅读1.3k次。可以把session与connection的使用关系分为三种 session使用的连接是被提供的,常常SessionFactory.openSession(connection,Interceptor?) session使用的连接被借给客户端,常常session.connection session通过connectionProvider.getConnection得到的连接..._sqlsessionfactory获取的connection用完如何释放
文章浏览阅读2.9k次,点赞7次,收藏36次。前言 信道是不同类型的信息,按照不同传输格式、用不同的物理资源承载的信息通道。根据信息类型的不同、处理过程的不同可将信道分为多种类型。 本文重点介绍LTE的逻辑信道、传输信道、物理信道等常见的信道类型,并和3G相应的信道类型作了比较,通过比较可以加深LTE信道结构的理解。最后给出LTE从逻辑信道到传输信道,再到物理信道的映射关系。依据不同的货物类型,采用不同的处理工..._lte各种信道
文章浏览阅读751次。一、print()函数概述print() 方法用于打印输出,是python中最常见的一个函数。该函数的语法如下:print(*objects, sep=' ', end='\n', file=sys.stdout)参数的具体含义如下: objects --表示输出的对象。输出多个对象时,需要用 , (逗号)分隔。 sep -- 用来间隔多个对象。 end..._print(*a, sep=' ')
文章浏览阅读5.9k次,点赞12次,收藏17次。使用坐标变换实现antvG6中自定义tooltip_antv-g6弹窗
文章浏览阅读473次。在学习完之间C++模板的相关知识之后,我们仿佛打开了一个新世界的大门,原来代码还可以这样用,但是问题又来了,即使是有模板了但是这个模板还要写出来,这样是不是太麻烦了,好像还没有到达懒的真正境界,那么为了满足大部分懒人的需要,惠普实验室来了一手绝活,他们将大量的函数模板、算法等等全部进行总结归纳,编写写成了一个巨大的仓库,这样程序员们在使用时只要调用相关函数接口便可以省下大把的头发,这个库就是我们长常说的STL标准模板库。_stl全称
文章浏览阅读336次。1.简介python 汉译: 蟒蛇发展史: 于1989年 由荷兰人吉多·范罗苏姆。 第一个公开发行版发行于 1991 年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。Python 2...._jetbrains pycharm 2017.2.3 x64
文章浏览阅读855次。1.Android广播机制概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间);2.同一app内部的不同组件之间的消息通信(单个进程);3.同一app具有多个进程_android 中的广播机制
文章浏览阅读7.8k次。上一篇《Android将webp格式图片转换为png格式方法》在app上线后,部分机型报出了bug,比如华为手机,会在包含静态库的页面中直接报错奔溃,经过反复调试发现网上下载的libweb.so 之前打包的时间有点早,对高版本的系统和cpu类型支持不好,所以在github上找了一个项目,配置到gradle:2.3.1,APP_ABI := all全CPU类型,相关SO压缩文件已经放到我的下载资源里_手机图片webp转换jpg
文章浏览阅读907次。传送门代码:#include<bits/stdc++.h>#define ri register intusing namespace std;const int rlen=1<<18|1;inline char gc(){ static char buf[rlen],*ib,*ob; (ib==ob)&&(ob=(ib=buf)+fread..._洛谷 bm