Excel转Json的需求

反正我对SSM基本不会的情况下来到现在这家公司,都是90后,感觉很好。第二天就给我开发任务,就是把用户上传的Excel文件转成JSON返回给前台用于大屏的数据展示。

解决方案

  • 方案1:百度一下,全是Java使用jxl去做的,我一开始也尝试这样做,但是卡死在一个地方,我们公司的SSM框架用户上传的File是MultipartFile的,它的流InputStream在构造Workbook时传递InputStream并不起作用,本地文件FileInputStream就可以,不知道是不是我无能,反正我没辙了。这东西感觉本来就是javase的。

  • 方案2:问了个大神,告诉我一个词叫POI。捣鼓了一天,终于解决了,对,解决方案就是 Apache的 POI(我的选择方案)

Excel的xls和xlsx的差别

  • xls 是Excel 2007以下版本的后缀名,但是所有excel都能打开,对应POI里HSSFWorkbook。

  • xlsx 是Excel 2007及以上版本的后缀名,对应POI里XSSFWorkbook。

需要的JAR包

如果只需要支持 xls
poi-3.9.jar
如果只需要支持 xlsx
poi-ooxml-3.8.jar
poi-ooxml-schemas-3.10-FINAL.jar
xmlbeans.jar
dom4j-1.6.1-hudson-1.jar

我的工具代码

import com.alibaba.fastjson.JSON;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile; import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List; /**
* Created by huangzheng on 2016/11/29.
*/
public class ExcelUtils {
/**
* 解决思路:采用Apache的POI的API来操作Excel,读取内容后保存到List中,再将List转Json(推荐Linked,增删快,与Excel表顺序保持一致)
*
* Sheet表1 ————> List1<Map<列头,列值>>
* Sheet表2 ————> List2<Map<列头,列值>>
*
* 步骤1:根据Excel版本类型创建对于的Workbook以及CellSytle
* 步骤2:遍历每一个表中的每一行的每一列
* 步骤3:一个sheet表就是一个Json,多表就多Json,对应一个 List
* 一个sheet表的一行数据就是一个 Map
* 一行中的一列,就把当前列头为key,列值为value存到该列的Map中
*
*
* @param file SSM框架下用户上传的Excel文件
* @return Map 一个线性HashMap,以Excel的sheet表顺序,并以sheet表明作为key,sheet表转换json后的字符串作为value
* @throws IOException
*/
public static LinkedHashMap<String,String> excel2json(MultipartFile file) throws IOException { System.out.println("excel2json方法执行...."); // 返回的map
LinkedHashMap<String,String> excelMap = new LinkedHashMap<>(); // Excel列的样式,主要是为了解决Excel数字科学计数的问题
CellStyle cellStyle;
// 根据Excel构成的对象
Workbook wb;
// 如果是2007及以上版本,则使用想要的Workbook以及CellStyle
if(file.getOriginalFilename().endsWith("xlsx")){
System.out.println("是2007及以上版本 xlsx");
wb = new XSSFWorkbook(file.getInputStream());
XSSFDataFormat dataFormat = (XSSFDataFormat) wb.createDataFormat();
cellStyle = wb.createCellStyle();
// 设置Excel列的样式为文本
cellStyle.setDataFormat(dataFormat.getFormat("@"));
}else{
System.out.println("是2007以下版本 xls");
POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream());
wb = new HSSFWorkbook(fs);
HSSFDataFormat dataFormat = (HSSFDataFormat) wb.createDataFormat();
cellStyle = wb.createCellStyle();
// 设置Excel列的样式为文本
cellStyle.setDataFormat(dataFormat.getFormat("@"));
} // sheet表个数
int sheetsCounts = wb.getNumberOfSheets();
// 遍历每一个sheet
for (int i = 0; i < sheetsCounts; i++) {
Sheet sheet = wb.getSheetAt(i);
System.out.println("第" + i + "个sheet:" + sheet.toString()); // 一个sheet表对于一个List
List list = new LinkedList(); // 将第一行的列值作为正个json的key
String[] cellNames;
// 取第一行列的值作为key
Row fisrtRow = sheet.getRow(0);
// 如果第一行就为空,则是空sheet表,该表跳过
if(null == fisrtRow){
continue;
}
// 得到第一行有多少列
int curCellNum = fisrtRow.getLastCellNum();
System.out.println("第一行的列数:" + curCellNum);
// 根据第一行的列数来生成列头数组
cellNames = new String[curCellNum];
// 单独处理第一行,取出第一行的每个列值放在数组中,就得到了整张表的JSON的key
for (int m = 0; m < curCellNum; m++) {
Cell cell = fisrtRow.getCell(m);
// 设置该列的样式是字符串
cell.setCellStyle(cellStyle);
cell.setCellType(Cell.CELL_TYPE_STRING);
// 取得该列的字符串值
cellNames[m] = cell.getStringCellValue();
}
for (String s : cellNames) {
System.out.print("得到第" + i +" 张sheet表的列头: " + s + ",");
}
System.out.println(); // 从第二行起遍历每一行
int rowNum = sheet.getLastRowNum();
System.out.println("总共有 " + rowNum + " 行");
for (int j = 1; j <= rowNum; j++) {
// 一行数据对于一个Map
LinkedHashMap rowMap = new LinkedHashMap();
// 取得某一行
Row row = sheet.getRow(j);
int cellNum = row.getLastCellNum();
// 遍历每一列
for (int k = 0; k < cellNum; k++) {
Cell cell = row.getCell(k); cell.setCellStyle(cellStyle);
cell.setCellType(Cell.CELL_TYPE_STRING);
// 保存该单元格的数据到该行中
rowMap.put(cellNames[k],cell.getStringCellValue());
}
// 保存该行的数据到该表的List中
list.add(rowMap);
}
// 将该sheet表的表名为key,List转为json后的字符串为Value进行存储
excelMap.put(sheet.getSheetName(),JSON.toJSONString(list,false));
} System.out.println("excel2json方法结束...."); return excelMap;
} }

  

Java 解析Excel文件为JSON的更多相关文章

  1. Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

    JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传 ...

  2. Java:JXL解析Excel文件

    项目中,有需求要使用JXL解析Excel文件. 解析Excel文件 我们先要将文件转化为数据流inputStream. 当inputStream很大的时候 会造成Java虚拟器内存不够 抛出内存溢出 ...

  3. 【Java】使用Apache POI生成和解析Excel文件

    概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...

  4. JXL包大解析;Java程序生成excel文件和解析excel文件内容

    最近需求变化,需要把excel导入 我以前没有做过,所以我查了一些资料 和参考别人的代码 以下是多种方式: import java.io.File; import java.io.FileInputS ...

  5. vue下载和上传excle数据文件,解析excel文件数据并存在数据库中

    下载: VUE: window.open("xxxx/downloadOldTaskDataFile.do_", "_blank"); JAVA: /** * ...

  6. 解析Excel文件并把数据存入数据库

    前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中.花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致 ...

  7. Jxl创建Excel文件和解析Excel文件

    import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; im ...

  8. 【转】java将excel文件转换成txt格式文件

    在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...

  9. java 解析excel工具类

      java 解析excel工具类 CreateTime--2018年3月5日16:48:08 Author:Marydon ReadExcelUtils.java import java.io.Fi ...

随机推荐

  1. SpringMVC源码解读 - HandlerMapping - RequestMappingHandlerMapping初始化

    RequestMappingHandlerMapping ,用于注解@Controller,@RequestMapping来定义controller. @Controller @RequestMapp ...

  2. Eclipse导入SVN项目的三种方式

    Eclipse导入SVN项目的三种方式 一.直接Import导入: 1.点击 File --> Import,进入导入项目窗口 2.选择从SVN检出项目,点击Next 3.选择创建新的资源库位置 ...

  3. 如何快速取消svn的关联

    我们很多文件和文件项目都是通过svn从服务器上下载的,但是有些时候,出于某些目的,我们不想让这个文件继续和svn服务器进行关联,我们就需要解除这个关联,我观察了网上的相关方法,居然还有忽悠我们用reg ...

  4. 在(Raspberry Pi)树莓派上安装NodeJS

    本文主讲如何在树莓派3B上安装node.js 环境描述1. 树莓派安装了`2016-11-25-raspbian-jessie-lite`(PS:在此版本的镜像中,默认禁用了ssh,在烧录好镜像之后, ...

  5. Lua脚本

    应用场景: 游戏开发 独立应用脚本 Web 应用脚本 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench 安全系统,如入侵检测系统 1. 在很多时候,我们可以将Lua直接嵌 ...

  6. TortoiseGit + msysgit 记住帐号密码方法及使用密匙的方法

    Windows 重度用户只能用 for windows 的软件了,所以虽然使用 Git,但还是要找专门的 windows 版本. 最近开始使用 GitHub 来托管一些小项目/兴趣,而自己是重度 wi ...

  7. java设计模式(三)模板模式

    抽象类中公开定义了执行它的方法的方式,子类可以按需求重写方法实现,但调用将以抽象类中定义的方式进行,典型应用如银行办理业务流程.冲泡饮料流程.下面给出简单例子,用沸水冲泡饮料,分为四步:将水煮沸.泡制 ...

  8. 属性通知之ObservableCollection

    单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...

  9. pygame系列_pygame的各模块叙述

    在pygame中,有很多模块,每个模块对应着不同的功能,如果我们知道这些模块是做什么的,那么,对我们的游戏开发会起到关键性的作用. 我们就说说pygame中的各个模块吧!!! #pygame modu ...

  10. Spring_Spring集成Quartz定时任务框架介绍和Cron表达式详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...