JAVA对excle创建、读取、设置单元格颜色、背景色、跨行跨列

pom.xml依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>RELEASE</version>
</dependency>
<!--  file文件转化为mutifile      -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.9</version>
</dependency>

读取

package com.example.test;

import org.apache.http.entity.ContentType;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class ExcelReadTest {
    /**
     *根据文件路径得到MultipartFile
     * @param url
     * @return
     * @throws IOException
     */
    public MultipartFile fileToMultipartFile(String url) throws IOException {
        File file = new File(url);
        FileInputStream fileInputStream = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile(file.getName(), file.getName(),
                ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
        return multipartFile;
    }

    /**
     * 将文件转化为可操作的类型
     * @param multipartFile
     * @return
     * @throws IOException
     */
    public Workbook getWorkFile(MultipartFile multipartFile) throws IOException {
        Workbook workbook = null;
        //获取文件的类型
        String type = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")+1);
        //获取文件字节输入流
        InputStream in = multipartFile.getInputStream();
        if ("xls".equals(type)) {
            workbook = new HSSFWorkbook(in);
        } else if ("xlsx".equals(type)) {
            workbook = new XSSFWorkbook(in);
        }
        return workbook;
    }

    /**
     * 遍历读取excel的每一个单元格
     * @param workbook
     */
    public void readFile(Workbook workbook) {
        //遍历sheet
        for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
            //得到单个sheet
            Sheet sheet = workbook.getSheetAt(numSheet);
            if (sheet == null) {
                continue;
            }
            //得到单个sheet的行数
            int rowCount = sheet.getLastRowNum();
            //从第二行开始,遍历Sheet的每一行(第一行一般是标题,所以不遍历)
            for (int rowNum = 1; rowNum <= rowCount; rowNum++) {
                try {
                    //得到单行数据
                    Row row = sheet.getRow(rowNum);
                    if (row != null) {
                        int cellCount = row.getLastCellNum();
                        for (int cellNum = 0;cellNum<cellCount;cellNum++){
                            Cell cell = row.getCell(cellNum);
                            String cellValue = "";
                            if (cell!=null){
//                                cell.setCellType(CellType.STRING);//提前设置String类型,防止数字后加.0
//                                cellValue = cell.getStringCellValue();
                                //如果上面的setCellType(CellType.STRING)过期,可以先将Cell转化为CellBase,然后再定义类型
                                CellBase cellBase = (CellBase) cell;
                                //设置单元格数据类型
                                cellBase.setCellType(CellType.STRING);
                                //此处得到每一个单元格的值
                                cellValue = cellBase.getStringCellValue();
                                System.out.print("cellValue:" + cellValue+";");
                            }
                        }
                        System.out.println();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public void excelUtil(String url) throws IOException {
        MultipartFile multipartFile = fileToMultipartFile(url);
        Workbook workbook = getWorkFile(multipartFile);
        readFile(workbook);
    }

    public static void main(String[] args) throws IOException {
        String file = "G:\\IDEAWorkspeace\\test\\excle\\src\\main\\resources\\excel\\试点团队配置模板.xls";
        ExcelReadTest test = new ExcelReadTest();
        test.excelUtil(file);
    }
}

写入

package com.example.test;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;

public class ExcelWriteTest {
    public void createExcel(){
        //1、创建workbook
        HSSFWorkbook wb = new HSSFWorkbook();

        //2、创建sheet
        HSSFSheet sheet = wb.createSheet("经营预算科目");
        sheet.setDefaultColumnWidth(20);

        ///3、创建第一行标题
        HSSFRow row = sheet.createRow(0);
        HSSFCellStyle titleStyle = wb.createCellStyle();
        /**
         * 设置边框
         */
        //下边框
        titleStyle.setBorderBottom(BorderStyle.THIN);
        //左边框
        titleStyle.setBorderLeft(BorderStyle.THIN);
        //上边框
        titleStyle.setBorderTop(BorderStyle.THIN);
        //右边框
        titleStyle.setBorderRight(BorderStyle.THIN);
        /**
         * 水平垂直居中
         */
        titleStyle.setAlignment(HorizontalAlignment.CENTER);
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //单元格背景色
        titleStyle.setFillForegroundColor(IndexedColors.RED1.getIndex());
        //单元格填充效果
        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        /**
         * 单元格内容的字体
         */
        Font font = wb.createFont();
        //设置字体颜色
        font.setColor((short)1);
        //设置字体加粗
        font.setBold(true);
        titleStyle.setFont(font);

        Cell cell = row.createCell(0);
        cell.setCellValue("经营期预算科目-费用类填报");
        cell.setCellStyle(titleStyle);
        //第一行标题直接跨所有列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
        /**
         * 第二行,设置单元格内容的值,没有值也要设置为空。防止没有值导致不能设置单元格框线的问题
         */
        row = sheet.createRow(1);
        cell = row.createCell(0);
        cell.setCellValue("预算科目代码");
        cell.setCellStyle(titleStyle);
        cell = row.createCell(1);
        cell.setCellValue("原科目");
        cell.setCellStyle(titleStyle);
        cell = row.createCell(2);
        cell.setCellValue("商业计划");
        cell.setCellStyle(titleStyle);
        cell.setCellStyle(titleStyle);
        cell = row.createCell(3);
        cell.setCellValue("新科目");
        cell.setCellStyle(titleStyle);
        cell = row.createCell(4);
        cell.setCellValue("");
        cell.setCellStyle(titleStyle);
        cell = row.createCell(5);
        cell.setCellValue("");
        cell.setCellStyle(titleStyle);
        cell = row.createCell(6);
        cell.setCellValue("");
        cell.setCellStyle(titleStyle);

        /**
         * 跨行跨列的合并,这里注意跨行跨列时,要保证起始行的起始列要有值
         */
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 6));
        sheet.addMergedRegion(new CellRangeAddress(1, 2, 0, 0));
        sheet.addMergedRegion(new CellRangeAddress(1, 2, 2, 2));

        /**
         * 插入第三行的值
         */
        row = sheet.createRow(2);
        List<String> title = new ArrayList<>();
        title.add("预算科目代码");
        title.add("原科目一级科目");
        title.add("商业计划");
        title.add("新科目大类");
        title.add("一级新科目");
        title.add("二级新科目");
        title.add("三级新科目");
        for (int i =0; i < title.size(); i++){
            cell = row.createCell(i);
            cell.setCellValue(title.get(i));
            cell.setCellStyle(titleStyle);
        }
        /**
         * 6、将生成的文件保存至指定文件夹下
         */
        try {
            File file = new File("G:\\IDEAWorkspeace\\test\\excle\\src\\main\\resources\\excel\\write.xls");
           if (file.exists()){
               file.delete();
           }
            FileOutputStream fout = new FileOutputStream(file);
            wb.write(fout);
            fout.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("文件已创建");
    }

    public static void main(String[] args) {
        ExcelWriteTest writeTest = new ExcelWriteTest();
        writeTest.createExcel();
    }
}

文件效果

 

单元格样式设置

        跨行跨列

        只需要一行代码即可完成。

//合并行列,参数一:开始行;参数二:结束行;参数三:开始列;参数四:结束列
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));

        设置字体

        Font font = wb.createFont();
        font.setColor((short)1);
        font.setBold(true);

        short值和颜色对应效果如图,来自POI4颜色名称,颜色汉语名称,颜色对应关系_lenovo96166的博客-CSDN博客

                 

 设置单元格样式

        HSSFCellStyle style = wb.createCellStyle();
        //居中
        style.setAlignment(HorizontalAlignment.CENTER);
        //背景色为鲜红色
        style.setFillForegroundColor(IndexedColors.RED1.getIndex());
        //背景色填充效果充满整个单元格
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setFont(font);

        单元格背景色编码与颜色对应效果如图,来自POI设置Excel单元格背景色(setFillForegroundColor与setFillPattern的使用) - 大墨垂杨 - 博客园                          

        单元格填充格式编码与实际效果对应关系如图,来自附录1——单元格设置背景色,FillPattern枚举效果_王事成的博客-CSDN博客_fillpatterntype颜色

 

总结

        此篇博文构建了对Excel文件进行读取、写入的帮助类,对单元格的字体颜色、背景色、跨行跨列方法进行了说明。尤其是背景色,字体颜色、填充格式与实际效果的对应关系,方便快速对单元格进行格式设置,如有其它遗漏的操作,恳请交流。