Java用POI复制excel单元格条件格式规则

8 篇文章 0 订阅
4 篇文章 0 订阅

1.说明

pom就不列了,POI版本为4.1.0

2.程序功能

将源单元格的条件格式规则复制到目标区域,兼容03与07。

3.代码如下


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.ConditionalFormatting;
import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
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.XSSFSheetConditionalFormatting;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @author sheromin
 * 
 */
public class ConditionalFormatMain {

    public static void main(String[] args) {
        try {
            FileInputStream inputStream=new FileInputStream("D:\\test.xlsx");
            XSSFWorkbook workbook=new XSSFWorkbook(inputStream);
            XSSFSheet sheet=workbook.getSheet("Sheet1");
            XSSFSheetConditionalFormatting scf =sheet.getSheetConditionalFormatting();
            XSSFRow row=sheet.getRow(0);
            XSSFCell cell=row.getCell(0);
            List<ConditionalFormattingRule> ruleList=getConditionalRule(sheet,cell);
            CellRangeAddress[] regions= {new CellRangeAddress(1,1,0,7)};
            if(ruleList!=null&& ruleList.size()>0) {
                for(ConditionalFormattingRule rule:ruleList) {
                    scf.addConditionalFormatting(regions,rule);//区域内添加规则
                }
            }
            workbook.write(new FileOutputStream("D:\\test.xlsx"));
            workbook.close();
            inputStream.close();
            System.out.print("Finish!!!");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static List<ConditionalFormattingRule> getConditionalRule(Sheet sheet,Cell cell){
        List<ConditionalFormattingRule> ruleList=new ArrayList<ConditionalFormattingRule>();
        if(cell!=null) {
            SheetConditionalFormatting scf=sheet.getSheetConditionalFormatting();//获取sheet中条件格式对象
            int countOfFormat=scf.getNumConditionalFormattings();//条件格式的数量
            for(int i=0;i<countOfFormat;i++) {
                ConditionalFormatting format=scf.getConditionalFormattingAt(i);//第countOfFormat个条件格式
                CellRangeAddress[] ranges=format.getFormattingRanges();//条件格式区域
                for(int r=0;r<ranges.length;r++) {
                    if(ranges[r].isInRange(cell)) {//cell是否在此区域
                        int numOfRule=format.getNumberOfRules();
                        for(int j=0;j<numOfRule;j++) {// 获取具体的规则
                            ConditionalFormattingRule rule=format.getRule(j);
                            ruleList.add(rule);
                        }

                    }
                }

            }
        }
        return ruleList;
    }
}

4.结果如下:
程序运行前
before test
程序运行后
程序运行后
经测试对于03和07版本的excel都适用。

可以使用POI的CellValueFormatter类来获取Excel单元格的数值格式。具体的操作如下: 1. 首先,使用POI读取Excel文件并获取一个单元格对象; 2. 然后,使用这个单元格对象的getCellType方法获取该单元格的数据类型; 3. 倘若该单元格的数据类型为数值型的话,可以使用POI的DateUtil类来判断该单元格的数值格式,并进行相应的处理。 例如,以下是一个使用POI获取Excel单元格数值格式的示例代码: ```java // 导入POI相关的库 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.usermodel.CellValue; import org.apache.poi.ss.usermodel.CellValue.CellTypeEnum; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.DataFormatter; public class Example { public static void main(String[] args) throws Exception { // 读取Excel文件 Workbook workbook = WorkbookFactory.create(new File("example.xlsx")); Sheet sheet = workbook.getSheetAt(0); // 获取某个单元格 Cell cell = sheet.getRow(0).getCell(0); // 判断单元格的数据类型 if (cell.getCellType() == CellType.NUMERIC) { // 判断单元格的数值格式 if (DateUtil.isCellDateFormatted(cell)) { // 处理日期型数据 Date date = cell.getDateCellValue(); String formattedDate = new SimpleDateFormat("yyyy/MM/dd").format(date); System.out.println(formattedDate); } else { // 处理普通数值型数据 Double value = cell.getNumericCellValue(); System.out.println(value); } } else { // 处理其他类型的数据 DataFormatter formatter = new DataFormatter(); String text = formatter.formatCellValue(cell); System.out.println(text); } } } ``` 以上代码使用POI读取了一个Excel文件中的单元格,并根据该单元格的数据类型和数值格式进行相应的处理。具体可以根据实际需要进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值