zoukankan      html  css  js  c++  java
  • JXL工具包对Excle文件操作

    1、简介:

    XL - JXL(Java Excel API)是一个用来动态读写 Excel 文件的开源框架,利用它可以 在任何支持 Java 的操作系统上动态读写 Excel 文件。

    2、开发步骤

    1、 jxl操作excel包括对象Workbook,Sheet ,Cell。
      一个excel就对应一个Workbook对象,
      一个Workbook可以有多个Sheet对象
      一个Sheet对象可以有多个Cell对象


    2、 读取excel操作
      通过Workbook,Sheet ,Cell这三个对象我们就可以实现Excel文件的读取工作
       a、 选取Excel文件得到工作薄
       b、 选择工作表
       c、 选择Cell
       d、 读取信息

    3、 读取工作薄

    4、 读取工作表

    5、 读取单元格

    6、 读取单元格的值

    2、工具类的代码:

    package com.turtle.com.turtle.utils;
    
    import jxl.Cell;
    import jxl.Sheet;
    import jxl.Workbook;
    import jxl.read.biff.BiffException;
    import jxl.write.Label;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * data:2019-10-18 15:00
     * anthor:Turtle Zhang
     * descriion:实用JXL的jar包,来完成对Excel文件的读写操作的工具类
     */
    public class ExcelUtil {
    
        /**
         * 读取Excel中的文件
         * 标题行我们放在行下标为0的地方,具体数据行按照数据量依次写入数组中
         * @param file:Excel文件的路径
         * @return:存放excel的数据
         */
        public static Map<String,String[][]> readExcel(File file) throws IOException, BiffException {
            if (file == null || "".equals(file)){
                throw new RuntimeException("请检查你的文件路径是否存在问题");
            }
            // 1:创建workbook
            Workbook workbook= Workbook.getWorkbook(file);
            // 2:得到所有的sheet
            Sheet[] sheets = workbook.getSheets();
            // 3:定义用来返回结果的Map
            Map<String,String[][]> resultMap = new HashMap<String,String[][]>();
            //3:获取数据
            for (Sheet sheet : sheets){
                // 得到sheet中的记录行数、列数
                Integer rows = sheet.getRows();
                Integer columns = sheet.getColumns();
                // 用来存放每一个sheet中的表格数据
                String[][] sheetResult = new String[rows][columns];
                for (int i = 0; i < rows; i++){
                    for (int j = 0; j<columns; j++){
                        // 注意该参数中的参数顺序,是列在前,行在后
                        Cell cell = sheet.getCell(j,i);
                        sheetResult[i][j] = cell.getContents();
                    }
                }
                // 把结果存入map集合中
                resultMap.put(sheet.getName(),sheetResult);
            }
            workbook.close();
            return  resultMap;
        }
    
        /**
         * 写入数据进Excel文件
         * @param file:Excel的路径
         * @param map:要写入的数据
         */
        public static void createExcel(File file,Map<String,String[][]>map) throws IOException, WriteException {
            if (file == null || "".equals(file)){
                throw new RuntimeException("请检查你的文件路径是否存在问题");
            }
            file.createNewFile();
            //2:创建工作簿
            WritableWorkbook workbook= Workbook.createWorkbook(file);
            int index = 0;
            for (Map.Entry<String, String[][]> entry : map.entrySet()){
                // 得到工作薄的名字、数据
                String sheetName = entry.getKey();
                String[][] sheetData = entry.getValue();
                //3:创建sheet
                // sheet:也就是左下角的表格文档多个选择
                WritableSheet sheet=workbook.createSheet(sheetName, index);
                // 写入单元格
                Label label = null;
                for (int i = 0; i< sheetData.length; i++) {
                    for (int j = 0; j< sheetData[i].length; j++) {
                        // 创建单元格中的数据
                        label = new Label(j,i,sheetData[i][j]);
                        // 将单元格中的数据加入工作薄中
                        sheet.addCell(label);
                    }
                }
                index++;
            }
            workbook.write();
            workbook.close();
        }
    } 

    3、进行写入测试:

    package com.turtle;
    
    import com.turtle.com.turtle.utils.ExcelUtil;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.Map;
    
    public class TestExcelUtil {
        public static void main(String[] args) {
            File file = new File("d:/test.xls");
            Map<String,String[][]> map = new HashMap<>();
            String[][] data_1 = new String[][]{{"NO.1","NO.2","NO.3","NO.4","NO.5"},{"1","2","3","4","5"},{"11","22","33","44","55"}};
            String[][] data_2 = new String[][]{{"NO.1","NO.2","NO.3","NO.4","NO.5"},{"a","b","c","d","e"},{"aa","bb","cc","dd","ee"}};
            map.put("第一个Sheet",data_1);
            map.put("第二条Sheet",data_2);
            try{
                // 使用工具类中的方法,写入
                ExcelUtil.createExcel(file,map);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    结果:

                                

    4、进行读取测试:

    package com.turtle;
    
    import com.turtle.com.turtle.utils.ExcelUtil;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.Map;
    
    public class TestExcelUtil {
        public static void main(String[] args) {
            File file = new File("d:/test.xls");
            try {
                Map<String,String[][]> result = ExcelUtil.readExcel(file);
                for(Map.Entry<String,String[][]> entry :result.entrySet()){
                    System.out.println("该Sheet的名字为:"+entry.getKey());
                    String[][] values = entry.getValue();
                    for(int i=0; i<values.length; i++){
                        for(int j=0 ; j<values[i].length; j++){
                            System.out.print(values[i][j]+"	               ");
                        }
                        System.out.println();
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    结果:

                      

    补充:

    // 排除excel文件中有未完全删除的空白记录行操作,减少异常报错数量
    int tempRows = sheet.getRows();
    int columns=sheet.getColumns();
    Boolean falg = false;  // 是否有数据的标志位
    int rows = 0;          // 实际的非空记录行数
    for(int i = 0; i < tempRows; i++){
        falg = false;
        for(int j = 0; j < columns; j++){
            // 只要该行记录,有一个单元格填了数据,我们就当这条数据是要进行上传的,让其可以上传,这里排除全空单元格的记录行上传
            if(StringUtils.isNotBlank(sheet.getCell(j, i).getContents())){
                falg = true;
                break;
            }                    
        }
        if(falg){
            rows++;
        }
    }
  • 相关阅读:
    Record of coding:Codeforces 1093E
    【刷题记录】网络流24题等
    【模板归纳】网络流及费用流
    【刷题记录】BZOJ2154 crash的数字表格 莫比乌斯反演
    【刷题记录】SDOI2017数字表格
    算法总结 给定范围内最大公约数为某一定值的数对个数的算法
    刷题记录【BZOJ2440 完全平方数】数论、组合数学、莫比乌斯函数
    刷题记录 【HAOI2007】理想的正方形 二维st表
    刷题记录【ZJOJ2005午餐】,贪心+DP或者
    刷题记录【ZJOI2007棋盘制作】二维DP,悬线法。。。
  • 原文地址:https://www.cnblogs.com/zhh19981104/p/11699250.html
Copyright © 2011-2022 走看看