apache poi通过改变背景色来重用这种风格

时间:2017-11-24 08:28:35

标签: java excel apache apache-poi

我正在使用apache poi 3.17创建一个Excel文件。

不同的列可能包含不同类型的值,我想相应地设置它们的样式。我不是每次都创建样式,而是尝试使用相同的样式(以避免不必要的对象创建)并更改必要的属性。例如:某些单元格我想制作斜体,有些是粗体,有些是黄色,有些是带下划线等。

但令我惊讶的是,我发现风格并没有改变。

下面是一个示例代码,我尝试将第1行设置为“黄色”并使用“红色”设置,但在生成的Excel中,所有行都是红色。

import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.xssf.usermodel.*;

import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class WriteExcelBasic {
public static void main(String[] args) throws IOException {

    String excelFileName = "/Users/username/Test3.xlsx";
    FileOutputStream fos = new FileOutputStream(excelFileName);


    XSSFWorkbook wb = new XSSFWorkbook();
    XSSFCellStyle style = wb.createCellStyle();

    XSSFSheet sheet = wb.createSheet("sheet");
    Font urlFont = wb.createFont();
    urlFont.setFontHeight((short)(9*20));
      style.setFont(urlFont);
    for (int r = 0; r < 3; r++) {
        XSSFRow row = sheet.createRow(r);


        for (int c = 0; c < 3; c++) {
            XSSFCell cell = row.createCell(c);


            Hyperlink link = wb.getCreationHelper().createHyperlink(HyperlinkType.URL);
            String ss = "http://news.google.com/news/headlines?ned=us&hl=en";
                  link.setAddress(ss);
            cell.setHyperlink(link);
            cell.setCellValue(ss);
            if(r == 1) {
                System.out.println("In yellow");
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                style.setFillForegroundColor(new XSSFColor(Color.YELLOW));
            } else {
                System.out.println("In red");
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                style.setFillForegroundColor(new XSSFColor(Color.RED));
            }
            cell.setCellStyle(style);


        }
    }

    try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
        wb.write(baos);
        byte[] myByteArray = baos.toByteArray();
        fos.write(myByteArray);
        fos.flush();
    }
    finally {
        wb.close();
        fos.close();
    }
}
}

要解决这个问题,我可以分别创建2个样式并根据条件应用它们但在实际情况下我必须创建24种不同的样式但是为此,我必须编写这么多冗余代码。

如果我想创建一个具有不同属性的新样式,那么我必须使用这个新属性创建另外24个样式。因此,复杂性将呈指数级增长。

因此,任何人都可以就此问题提出一些建议吗?

0 个答案:

没有答案