Java用POI複製excel單元格條件格式規則

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都適用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章