java 使用 POI 操作Excel实现导入导出功能

1 篇文章 0 订阅

主要依赖

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

Excel 导入

/**
 *
 * @param filePath 文件绝对路径
 * @param head 是否读标题行
 * @return List<Map<第几列, 单元格数据>>
 */
public static List<Map<Integer, String>> inExcel(String filePath, Boolean head) {
    try {
    	// 读取文件
        File file = new File(filePath);
        FileInputStream fileInputStream = new FileInputStream(file);
        // 定义数据保存的集合
        List<Map<Integer, String>> lists = new ArrayList<>();
        // 打开Excel
        XSSFWorkbook book = new XSSFWorkbook(fileInputStream);
        // 获取第一个Sheet
        XSSFSheet sheet = book.getSheetAt(0);
        if (head) {
            //读标题行(第一行)
            XSSFRow rowHead = sheet.getRow(0);
            // 列数
            int cols = rowHead.getPhysicalNumberOfCells();
            Map<Integer, String> map = new HashMap<>(cols);
            for (int j = 0; j < cols; j++) {
            	// 设置序列化方式
                rowHead.getCell(j).setCellType(CellType.STRING);
                // 获取单元格数据
                String row1 = rowHead.getCell(j).getStringCellValue();
                // map.put("哪一列", "数据")
                map.put(j + 1, row1);
            }
            lists.add(map);
        }
        //读数据行(第二行开始)
        for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
            XSSFRow row = sheet.getRow(i);
            // 列数
            int cols = row.getPhysicalNumberOfCells();
            Map<Integer, String> map = new HashMap<>(cols);
            for (int j = 0; j <= cols; j++) {
                XSSFCell cell = row.getCell(j);
                    if (cell == null){
                        map.put(j + 1, "");
                    }else {
                    	// 设置序列化方式
                        cell.setCellType(CellType.STRING);
                        // 获取单元格数据
                        String row1 = cell.getStringCellValue();
                        // map.put("哪一列", "数据")
                        map.put(j + 1, row1);
                    }
            }
            lists.add(map);
        }
        return lists;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Excel 导出

/**
 * name-列的标题; value-列的数据
 */
@ToString
@Getter
public class ExportDto {
    private List<ExportPart>  exportParts;
    public ExportDto() {
        exportParts = new ArrayList<>(20);
    }
    public void add(String name, Object value){
        ExportPart exportPart = new ExportPart(name, value);
        exportParts.add(exportPart);
    }
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class ExportPart{
        private String name;
        private Object value;
    }
}
/**
 *
 * @param exportDtos 需要导出的数据
 * @return XSSFWorkbook 
 */
private XSSFWorkbook export(List<ExportDto> exportDtos) {
    try {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet();
        //设置列宽
        sheet.setDefaultColumnWidth((short) 18);
        //创建第一行,填充标题内容
        XSSFRow row = sheet.createRow(0);
        if (CollectionUtil.isEmpty(exportDtos)){
            return workbook;
        }
        List<ExportDto.ExportPart> exportParts = exportDtos.get(0).getExportParts();
        for (short i = 0; i < exportParts.size(); i++) {
            //创建单元格
            XSSFCell cell = row.createCell(i);
            XSSFRichTextString text = new XSSFRichTextString(exportParts.get(i).getName())
            //给单元格设置内容
            cell.setCellValue(text);
        }
        //填充多行
        for (int i = 0; i < exportDtos.size(); i++) {
            //从第二行开始填充数据
            row = sheet.createRow(i + 1);
            ExportDto exportDto = exportDtos.get(i);
            List<ExportDto.ExportPart> partList = exportDto.getExportParts();
            //填充一行
            for (int j = 0; j < partList.size(); j++) {
                Object value = partList.get(j).getValue();
                String string = value == null ? "" : value.toString();
                //创建单元格
                XSSFCell cell = row.createCell(j);
                XSSFRichTextString richString = new XSSFRichTextString(string);
                XSSFFont font = workbook.createFont();
                richString.applyFont(font);
                cell.setCellValue(richString);
            }
        }
        return workbook;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
/**
 * 将输出流写入HttpServletResponse
 */
private void setResponseOutputStream(HttpServletResponse response, XSSFWorkbook hssfWorkbook, String fileName) {
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    try {
        response.addHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
    try {
        hssfWorkbook.write(response.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}
/**
 *
 * @param HttpServletResponse 
 */
public void export(HttpServletResponse response) {
	// 从数据库中获取数据
    List<IndicatorsEntity> entities = indicatorsDao.queryAllList();
    ArrayList<ExportDto> exportDtos = new ArrayList<>();
    AtomicReference<Integer> num = new AtomicReference<>(1);
    // 生成需要导出的数据格式
    entities.forEach(entity -> {
        ExportDto exportDto = new ExportDto();
        exportDto.add("序号", String.valueOf(num.getAndSet(num.get() + 1)));
        exportDto.add("所属期", entity.getBelongYear());
        exportDtos.add(exportDto);
    });
    String fileName = UUIDUtil.generateDefaultUUID() + ".xlsx";
    // 定义在上方
    XSSFWorkbook workbook = export(exportDtos);
    // 定义在上方
    setResponseOutputStream(response, workbook, fileName);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaPOI是一个用于读取和写入Microsoft Office格式文件(如Excel、Word和PowerPoint)的开源Java库。使用JavaPOI可以实现Excel导入导出操作。下面是一个简单的示例代码,演示如何使用JavaPOI实现Excel导入导出功能: 1. 导入Excel文件: ```java import org.apache.poi.ss.usermodel.*; public class ExcelImporter { public static void main(String[] args) { try { Workbook workbook = WorkbookFactory.create(new File("path/to/excel/file.xlsx")); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { // 处理单元格数据 String cellValue = cell.getStringCellValue(); System.out.print(cellValue + "\t"); } System.out.println(); } workbook.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 2. 导出Excel文件: ```java import org.apache.poi.ss.usermodel.*; public class ExcelExporter { public static void main(String[] args) { try { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 创建表头 Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("Name"); headerRow.createCell(1).setCellValue("Age"); headerRow.createCell(2).setCellValue("Email"); // 写入数据 Row dataRow = sheet.createRow(1); dataRow.createCell(0).setCellValue("John Doe"); dataRow.createCell(1).setCellValue(25); dataRow.createCell(2).setCellValue("johndoe@example.com"); FileOutputStream outputStream = new FileOutputStream("path/to/excel/file.xlsx"); workbook.write(outputStream); workbook.close(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码演示了使用JavaPOI导入导出Excel文件的基本操作。你可以根据自己的需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值