poi技术实现Excel导入_java json库

poi技术实现Excel导入_java json库J2EE下Excel转JSON题外话:苦逼毕业狗,在北京做Android还没毕业就10K,回到长沙后连个面试机会都没有。毕业狗总是被瞧不起没有工作经验,好歹我在北京干了大半年呢。一是Android开发太饱和了,门槛低,谁学谁会,二是Android原生开发不行了,在Hybrid混合式和FaceBook主推的ReactNative新开发模式下,越来越多新型创业公司钟情于后两种开发模式。所以我果断抛弃An

大家好,又见面了,我是你们的朋友全栈君。

J2EE下Excel转JSON

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;
    }

}

Copy走以上代码,或者联系我需要以上源代码和Jar包的,留下一句“世界和平“和邮箱,我就发给你

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135266.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月3日 下午2:20
下一篇 2022年5月3日 下午2:20


相关推荐

  • [深度学习] FM & FFM 算法基本原理

    [深度学习] FM & FFM 算法基本原理在推荐系统和计算广告业务中,点击率CTR(click-throughrate)和转化率CVR(conversionrate)是衡量流量转化的两个关键指标。准确的估计CTR、CVR对于提高流量的价值,增加广告及电商收入有重要的指导作用。无论使用什么类型的模型,点击率这个命题可以被归纳到二元分类的问题,我们通过单个个体的特征,计算出对于某个内容,是否点击了,点击了就是1,没点击就是0。对于任何二元分类的问题,最后我们都可以归结到逻辑回归上面。早期的人工特征工程+LR(Logisti…

    2022年5月1日
    68
  • GitHub怎么用?GitHub是什么?新手怎么用GitHub?图文并茂,不看都不行

    GitHub怎么用?GitHub是什么?新手怎么用GitHub?图文并茂,不看都不行GitHub 怎么用 GitHub 是什么 新手怎么用 GitHub 这些问题都不是问题了 英文 10 分 满分 100 分 水平的人来说 这个教程和小说很重要 这妮儿图文并茂 比我还幽默汗 我就直接转载过来 需要的同学赶紧马克走吧 绝对新手入门极品 nbsp 小说 我就不说这教程 md 不能再生动 作者 珊姗是个小太阳链接 http www zhihu com question

    2026年3月18日
    2
  • 随机函数生成随机正负小数(c语言自动生成随机数)

    原文转自:http://zhidao.baidu.com/question/560968122001783204.htmlC语言生成的随机数为无符号数,即都是正的。要想生成正负随机的,可以先通过模除限定返回,再减去对应的范围的中间值即可。比如,要获取-1000~+1000范围的随机数,总的数量为2001个,这样就可以通过代码rand()%2001使得到的结果限制在0-2000范围

    2022年4月16日
    87
  • Modbus协议解析–小白一看就懂的协议

    Modbus协议解析–小白一看就懂的协议文章目录提问三连 1 什么是 Modbus 2 Modbus 用来干什么 3 Modbus 的内容是什么 提问三连什么是 Modbus Modbus 用来干什么 Modbus 怎么用 1 什么是 Modbus 顾名思义 他是一个 bus 即总线协议 如果你接触到这种协议 相信你所处的行业是工业方面或者你的产品用于工业 Modbus 是一种串行通信协议 是 Modicon 公司 现在的施耐德电气 Schn

    2026年3月19日
    2
  • Python中的log文件(详细教程)

    Python中的log文件(详细教程)

    2020年11月8日
    348
  • JavaScript作用域和作用域链详解

    JavaScript作用域和作用域链详解JavaScript 作用域链详解一 JavaScript 作用域 JavaScript 作用域是什么 作用域范围二 JavaScript 作用域链作用域与执行上下文总结一 JavaScript 作用域 JavaScript 作用域是什么 作用域是在运行时代码中的某些特定部分中变量 函数和对象的可访问性 换句话说 作用域决定了代码区块中变量和其他资源的可见性 作用域范围块语句 大括号 中间的语句 如 if 和 switch 条件语句或 for 和 while 循环语句 不像函数 它们不会创建一个新的作用域

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号