Java实现生成Excel表格并将数据导入及按照Excel模板实现数据导入

本文介绍如何使用Java和Apache POI库生成Excel文件并导入数据,包括直接创建Excel和按照固定模板导入数据的方法。提供了详细的代码示例,涵盖工作簿创建、表格填充、单元格样式设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:项目中用到邮件发送功能,需要将数据导入excel表格然后发送给供应商,第一次做的时候是直接创建了一个excel,领导说比较丑,就找甲方要了个模板,所以本篇文章除了介绍直接生成excel导入数据的功能以外,也介绍按照固定模板的方式导入数据的功能。

1.新生成一个Excel,并将数据导入

package com.tdhc.common.util;

import com.tdhc.common.model.PuEnquiry;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.ByteArrayOutputStream;
import java.util.List;

/**
 * 将对象转换为excel表格,并转化为字节输出流返回
 */
public class CreateExcel {
    public static ByteArrayOutputStream CreateExccel(List<PuEnquiry> list){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //创建一个工作薄对象
        Workbook workbook = new XSSFWorkbook();
        // 创建一个表
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet("sheet1");
        //创建首行
        Row row = sheet.createRow(0);

        row.createCell(0).setCellValue("询价单号");
        row.createCell(1).setCellValue("请购单号");
        row.createCell(2).setCellValue("物资名称");
        row.createCell(3).setCellValue("规格型号");
        row.createCell(4).setCellValue("单位");
        row.createCell(5).setCellValue("申报量");
        row.createCell(6).setCellValue("单价");
        row.createCell(7).setCellValue("备货日期");
        row.createCell(8).setCellValue("货物信息/图片");
        row.createCell(9).setCellValue("有效日期");
        row.createCell(10).setCellValue("供应商名称");
        row.createCell(11).setCellValue("公司简称");
        row.createCell(12).setCellValue("电邮地址");
        row.createCell(13).setCellValue("联系人");
        row.createCell(14).setCellValue("联系电话");
        for(int i=1;i<list.size();i++) {
            XSSFRow row1 = sheet.createRow(i);
            row1.createCell(0).setCellValue(list.get(i-1).getEnquirynum());
            row1.createCell(1).setCellValue(list.get(i-1).getDocumentcode());
            row1.createCell(2).setCellValue(list.get(i-1).getMatname());
            row1.createCell(3).setCellValue(list.get(i-1).getSpecification());
            row1.createCell(4).setCellValue(list.get(i-1).getUnit());
            row1.createCell(5).setCellValue(list.get(i-1).getDeclarequantity());
            row1.createCell(6).setCellValue(list.get(i-1).getUnitprice());
            row1.createCell(7).setCellValue(list.get(i-1).getReadydate());
            row1.createCell(8).setCellValue(list.get(i-1).getCargoinfo());
            row1.createCell(9).setCellValue(list.get(i-1).getEffectivedate());
            row1.createCell(10).setCellValue(list.get(i-1).getSupname());
            row1.createCell(11).setCellValue(list.get(i-1).getSupshortname());
            row1.createCell(12).setCellValue(list.get(i-1).getSupemail());
            row1.createCell(13).setCellValue(list.get(i-1).getSuplinkman());
            row1.createCell(14).setCellValue(list.get(i-1).getSuplinkmanphone());
        }
        try {
            workbook.write(baos);
            baos.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return baos;
    }
}

步骤:创建工作薄–创建表–创建行–创建单元格–操作单元格
备注:不用管方法的返回值及工作流,因为我是为了配合邮件发送excel附件才那么做的,只用关注创建工作簿到setCellValue就可以了。

2.按照固定excel模板导入数据

package com.tdhc.common.util;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.examples.CreateCell;

import java.io.*;
import java.util.List;

public class CreateExcelAsTemp {
    public static ByteArrayOutputStream CreateExcel(List<Person> list) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 读取源文件
        FileInputStream fis = new FileInputStream("F:/test.xlsx");
        XSSFWorkbook workBook = new XSSFWorkbook(fis);

        // 进行模板的克隆(接下来的操作都是针对克隆后的sheet)
        XSSFSheet sheet = workBook.cloneSheet(0);
        workBook.setSheetName(1, "询价单"); // 给sheet命名
        workBook.removeSheetAt(0);
        XSSFCellStyle cellStyle = workBook.createCellStyle();
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
        cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());//底框黑色
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左边黑色
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());  // 上边黑色
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
        cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());  // 右边黑色
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 字体居中

        for (int i=10;i<list.size()+10;i++){
            Row row = sheet.createRow(i);

            Cell cell = row.createCell(0);
            cell.setCellStyle(cellStyle);
            cell.setCellValue(i-9);

            Cell cell1 = row.createCell(1);
            cell1.setCellStyle(cellStyle);
            cell1.setCellValue((list.get(i-10).getName()));

            Cell cell2 = row.createCell(2);
            cell2.setCellStyle(cellStyle);
            cell2.setCellValue(list.get(i-10).getAge());

            Cell cell3 = row.createCell(3);
            cell3.setCellStyle(cellStyle);
            cell3.setCellValue(list.get(i-10).getAddress());

            Cell cell4 = row.createCell(4);
            cell4.setCellStyle(cellStyle);
            cell4.setCellValue(list.get(i-10).getBirthday());

            Cell cell5 = row.createCell(5);
            cell5.setCellStyle(cellStyle);
            cell5.setCellValue(list.get(i-10).getBirthday());

            Cell cell6 = row.createCell(6);
            cell6.setCellStyle(cellStyle);
            cell6.setCellValue(list.get(i-10).getAaa());

            Cell cell7 = row.createCell(7);
            cell7.setCellStyle(cellStyle);
            cell7.setCellValue(list.get(i-10).getBbb());

            Cell cell8 = row.createCell(8);
            cell8.setCellStyle(cellStyle);
            cell8.setCellValue(list.get(i-10).getCcc());

            Cell cell9 = row.createCell(9);
            cell9.setCellStyle(cellStyle);
            cell9.setCellValue(list.get(i-10).getDdd());
        }

        try {
            workBook.write(baos);
            baos.close();
            /*FileOutputStream fileOutputStream = new FileOutputStream("F:/aaa.xlsx");
            workBook.write(fileOutputStream);
            fileOutputStream.close();*/
        }catch (Exception e){
            e.printStackTrace();
        }
        return baos;
    }
}

步骤: 从磁盘中读取源文件–根据源文件克隆sheet–操作(之后的类似于第一种操作,多了设置样式的代码是因为我要跟模板对应上,而且setCellValue和SetCellStyle不能同时写在一行,所以后边的而代码看起来比较多)
备注: 克隆完之后的操作类似于第一种操作,这里使用的是克隆的方式,当然也可以使用POI读取之类的方式,达成效果即可。

关于参考的操作单元格的技术博客:
https://www.cnblogs.com/jym-sunshine/p/4917476.html
https://www.cnblogs.com/yanjie-java/p/8329276.html
这两个是对于我来说比较有用的,当然也有其他大佬的博客同样优秀,例子很多,有关的功能可以搜索一下作为参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值