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

news/2024/7/21 7:01:25 标签: poi, excel, csv, apache, stream
  以下的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;
    }
}

执行截图


http://www.niftyadmin.cn/n/982092.html

相关文章

[转]Ubuntu系统下常用的新建、删除、拷贝文件命令

我们在Ubuntu系统中安装程序时&#xff0c;经常要在usr目录下新建、拷贝文件&#xff0c;此文件夹在Linux类系统中需要root权限才能访问&#xff0c;因此用常规的鼠标右键菜单操作是无效的&#xff0c;今天分享一下在终端中使用命令新建、拷贝文件。 相关命令&#xff1a; cd 路…

virtualenv_Virtualenv快速入门指南

virtualenvI was searching for a nice virtualenv quickstart guide today, but couldn’t find one that I liked. Either they were outdated and still relied on easy_install, or they were too complicated. So here’s my own. 我今天在寻找一个不错的virtualenv快速入…

【转】分布式系统的一致性算法简介

分布式一致性算法&#xff1a;http://welcome66.iteye.com/blog/2216571转载于:https://www.cnblogs.com/moonandstar08/p/5582220.html

Python 学习笔记【01】基本介绍

python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。 Python主要应用领域&#xff1a;WEB开发、数据分析、网络编程、云计算、系统运维。 编程语言主要从以下几个角度为进行分类&#xff0c;编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定…

232. Implement Queue using Stacks

/** 232. Implement Queue using Stacks* 2016-6-14 by Mingyang* 只用两个stack&#xff0c;每次只用改push得程序&#xff0c;只要这个每次进来一个&#xff0c;就把所有的依次弹入另一个&#xff0c;加入值以后依次弹回来* 这里跟implement stack using queue不一样&#xf…

java对象转变为map

直接上代码 package com.**.**.**.common;import com.**.**.**.util.JsonUtils; import org.springframework.beans.BeanUtils; import org.springframework.util.ReflectionUtils;import java.util.Arrays; import java.util.HashMap; import java.util.Map;public class Clas…

oauth0 oauth2_OAuth需要死于大火

oauth0 oauth2As a personal project I’ve recently been looking into creating a small Twitter client in Objective-C/Cocoa. This is largely because I quite like Objective-C as a language and haven’t had the chance to write anything significant in it, but al…

Android SDK路径不能含有空格

错误&#xff0c; android sdk location shoud not contain whitespace,as this can cause problems with thte ndk tools 转载于:https://www.cnblogs.com/chiangfai/p/5828181.html