• Java通过poi创建Excel文件并分页追加数据


      以下的main函数,先生成一个excel文件,并设置sheet的名称,设置excel头;而后,以分页的方式,向文件中追加数据

    maven依赖

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.12</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.12</version>
            </dependency>

    代码示例

    package com.**.**.**.common.utils;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.*;
    
    /**
     * @author zyydd
     * @date 2019/3/15 15:00
     */
    public class ExcelUtils {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtils.class);
    
        /**
         * 以下测试方法,先生成一个excel文件,并设置sheet的名称,设置excel头
         * 之后,以分页的方式,向文件中增加数据
         *
         * @param args
         */
        public static void main(String[] args) throws IOException {
            String fileAbsolutePath = "D:\test.xlsx";
            Map<String, List<DataForExcel>> dataMap = initTestDataHead();
            ExcelUtils.generateExcelWithManySheets(fileAbsolutePath, dataMap);
            for (int i = 0; i < 3; i++) {
                List<String[]> testData = new ArrayList<>();
                for (int k = 1; k < 11; k++) {
                    String[] oneRow = new String[6];
                    oneRow[0] = (i * 10 + k) + "";
                    oneRow[1] = "张三" + oneRow[0];
                    oneRow[2] = "男";
                    oneRow[3] = "北京市朝阳区";
                    oneRow[4] = "北京市大兴区";
                    oneRow[5] = (System.currentTimeMillis() % 10000000000L) + "";
                    testData.add(oneRow);
                }
                ExcelUtils.addExcel(fileAbsolutePath, 0, testData);
            }
        }
    
        private static Map<String, List<DataForExcel>> initTestDataHead() {
            Map<String, List<DataForExcel>> dataMap = new HashMap<String, List<DataForExcel>>();
            List<DataForExcel> dataForExcelList1 = new ArrayList<DataForExcel>();
            dataForExcelList1.add(new DataForExcel(0, 0, "序号"));
            dataForExcelList1.add(new DataForExcel(0, 1, "姓名"));
            dataForExcelList1.add(new DataForExcel(0, 2, "性别"));
            dataForExcelList1.add(new DataForExcel(0, 3, "家庭住址"));
            dataForExcelList1.add(new DataForExcel(0, 4, "通信地址"));
            dataForExcelList1.add(new DataForExcel(0, 5, "手机号"));
            dataMap.put("人员明细", dataForExcelList1);
            return dataMap;
        }
    
        /**
         * 传入数据,在指定路径下生成Excel文件 支持生成多个sheet,并为sheet命名
         *
         * @param absolutePath    生成文件的绝对路径,例如"C:\Users\...\out.xlsx"
         * @param dataForExcelMap key:sheet名; value:传入的数据 名字相同时会覆盖之前的文件
         * @return
         */
        public static boolean generateExcelWithManySheets(String absolutePath, Map<String, List<DataForExcel>> dataForExcelMap) {
            boolean flag = false;
            try {
                XSSFWorkbook workbook = new XSSFWorkbook();
                for (Map.Entry<String, List<DataForExcel>> entry : dataForExcelMap.entrySet()) {
                    XSSFSheet sheet = workbook.createSheet(entry.getKey());
                    List<DataForExcel> dataForExcel = entry.getValue();
                    Collections.sort(dataForExcel, (arg0, arg1) -> arg0.getRow().compareTo(arg1.getRow()));
                    XSSFRow nrow = null;
                    for (DataForExcel data : dataForExcel) {
                        if (dataForExcel.indexOf(data) == 0 || !data.getRow().equals(dataForExcel.get(dataForExcel.indexOf(data) - 1).getRow())) {
                            nrow = sheet.createRow(data.getRow());
                        }
                        XSSFCell ncell = nrow.createCell(data.getColumn());
                        ncell.setCellValue(data.getValue());
                    }
                }
                File file = new File(absolutePath);
                file.createNewFile();
                FileOutputStream stream = FileUtils.openOutputStream(file);
                workbook.write(stream);
                stream.close();
                flag = true;
            } catch (IOException ie) {
                LOGGER.error(ie.getMessage());
            } catch (Exception e) {
                LOGGER.error(e.getMessage());
            }
            return flag;
        }
    
        /**
         * 向已存在的excel中追加数据
         *
         * @param absolutePath 已存在的excel绝对路径
         * @param sheetIndex   sheet的序号,从0开始
         * @param dataList     cell数据
         * @return
         * @throws IOException
         */
        public static Boolean addExcel(String absolutePath, int sheetIndex, List<String[]> dataList) throws IOException {
            int columnsNum = dataList.get(0).length;
            FileInputStream fs = new FileInputStream(absolutePath);
            XSSFWorkbook wb = new XSSFWorkbook(fs);
            XSSFSheet sheet = wb.getSheetAt(sheetIndex);
            XSSFRow row;
            int lastRowNum = sheet.getLastRowNum();
            FileOutputStream out = new FileOutputStream(absolutePath);
            for (int i = 0; i < dataList.size(); i++) {
                row = sheet.createRow(++lastRowNum);
                String[] addOneRowData = dataList.get(i);
                for (int j = 0; j < addOneRowData.length; j++) {
                    String str = addOneRowData[j];
                    row.createCell(j).setCellValue(str);
                }
            }
            setSheetStyle(sheet, columnsNum - 1);
            wb.write(out);
            out.flush();
            out.close();
            return true;
        }
    
        private static XSSFSheet setSheetStyle(XSSFSheet sheet, int columnsNum) {
            sheet.createFreezePane(0, 1, 0, 1);
            String columnRange = "A1:" + (char) (65 + columnsNum) + "1";
            sheet.setAutoFilter(CellRangeAddress.valueOf(columnRange));
            for (int i = 0; i <= columnsNum; i++) {
                sheet.autoSizeColumn(i);
            }
            return sheet;
        }
    
    
    }
    package com.**.**.**.common.utils;
    
    /**
     * @author zyydd
     * @date 2019/3/15 15:00
     */
    public class DataForExcel {
        /**
         * excel的行号 从0开始 例如excel一个表格行号为0,列号也为0
         */
        private Integer row;
        /**
         * excel的列号 从0开始 例如excel一个表格行号为0,列号也为0
         */
        private Integer column;
        /**
         * 插入的值
         */
        private String value;
    
        public DataForExcel() {
        }
    
        public DataForExcel(Integer row, Integer column, String value) {
            this.row = row;
            this.column = column;
            this.value = value;
        }
    
        public Integer getRow() {
            return row;
        }
    
        public void setRow(Integer row) {
            this.row = row;
        }
    
        public Integer getColumn() {
            return column;
        }
    
        public void setColumn(Integer column) {
            this.column = column;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }

    执行截图

  • 相关阅读:
    Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)
    Linux下DNS简单部署(主从域名服务器)
    MySQL 读写分离方案-MySQL Proxy环境部署记录
    Linux系统本地yum源环境配置记录
    Swarm基于多主机容器网络 (overlay networks )
    Docker管理工具
    Linux下相关性能指标数据采集
    Docker网络解决方案
    Java的接口和抽象类
    Java 8 lambda表达式示例
  • 原文地址:https://www.cnblogs.com/zhenyuyaodidiao/p/11793976.html
Copyright © 2020-2023  润新知