我正在使用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个样式。因此,复杂性将呈指数级增长。
因此,任何人都可以就此问题提出一些建议吗?