我正在使用 JSF,Primefaces和XHTML 开发 Java Web应用程序。
其中,我尝试使用 POI 从 Excel 中读取 Cell 内容。在单元格中,它包含一些样式(粗体,颜色,直线,下划线等)以及值。
所以现在,我需要在 XHTML 页面中显示该值以及该单元格的所有样式。
请帮我解决这个问题。
答案 0 :(得分:1)
样式应用于整个单元格或富文本字符串内容中的单元格内容的一部分。
如果应用于整个单元格,则单元格样式应用Font,您可以从中获取样式。
要从富文本字符串内容中获取样式,您需要从单元格中获取RichTextString。这包括多个格式化运行,每个格式都有一个应用了Font
的样式。因此,您需要循环遍历所有格式化运行以获取其样式及其Font
。
示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
class ReadExcelRichTextCells {
static StringBuffer getHTMLFormatted(String textpart, Font font) {
StringBuffer htmlstring = new StringBuffer();
boolean wasbold = false;
boolean wasitalic = false;
boolean wasunderlined = false;
boolean wassub = false;
boolean wassup = false;
if (font != null) {
if (font.getBold() ) {
htmlstring.append("<b>");
wasbold = true;
}
if (font.getItalic()) {
htmlstring.append("<i>");
wasitalic = true;
}
if (font.getUnderline() == Font.U_SINGLE) {
htmlstring.append("<u>");
wasunderlined = true;
}
if (font.getTypeOffset() == Font.SS_SUB) {
htmlstring.append("<sub>");
wassub = true;
}
if (font.getTypeOffset() == Font.SS_SUPER) {
htmlstring.append("<sup>");
wassup = true;
}
}
htmlstring.append(textpart);
if (wassup) {
htmlstring.append("</sup>");
}
if (wassub) {
htmlstring.append("</sub>");
}
if (wasunderlined) {
htmlstring.append("</u>");
}
if (wasitalic) {
htmlstring.append("</i>");
}
if (wasbold) {
htmlstring.append("</b>");
}
return htmlstring;
}
public static void main(String[] args) throws Exception {
Workbook wb = WorkbookFactory.create(new FileInputStream("ExcelRichTextCells.xlsx"));
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellTypeEnum()) {
case STRING: //CellType String
XSSFRichTextString richtextstring = (XSSFRichTextString)cell.getRichStringCellValue();
String textstring = richtextstring.getString();
StringBuffer htmlstring = new StringBuffer();
if (richtextstring.hasFormatting()) {
for (int i = 0; i < richtextstring.numFormattingRuns(); i++) {
int indexofformattingrun = richtextstring.getIndexOfFormattingRun(i);
String textpart = textstring.substring(indexofformattingrun,
indexofformattingrun + richtextstring.getLengthOfFormattingRun(i));
Font font = richtextstring.getFontOfFormattingRun(i);
// font might be null if no formatting is applied to the specified text run
// then font of the cell should be used.
if (font == null) font = wb.getFontAt(cell.getCellStyle().getFontIndex());
htmlstring.append(getHTMLFormatted(textpart, font));
}
} else {
Font font = wb.getFontAt(cell.getCellStyle().getFontIndex());
htmlstring.append(getHTMLFormatted(textstring, font));
}
System.out.println(htmlstring);
break;
//case ... other CellTypes
default:
System.out.println("default cell"); //should never occur
}
}
}
wb.close();
}
}
此代码已使用apache poi 3.17
进行测试。
要将此代码与apache poi 4.0.1
一起使用,请使用CellStyle.getCellType
代替getCellTypeEnum
和CellStyle.getFontIndexAsInt
代替getFontIndex
。
...
//switch (cell.getCellTypeEnum()) {
switch (cell.getCellType()) {
...
//Font font = wb.getFontAt(cell.getCellStyle().getFontIndex());
Font font = wb.getFontAt(cell.getCellStyle().getFontIndexAsInt());
...
//if (font == null) font = wb.getFontAt(cell.getCellStyle().getFontIndex());
if (font == null) font = wb.getFontAt(cell.getCellStyle().getFontIndexAsInt());
...
答案 1 :(得分:0)
感谢 @Axel ,因为他的回答不包括颜色,所以我决定添加它。但不幸的是,在我的情况下, Class A {
....
if(applicationIsRunning){
// use/return/extend/replace/??? from ProxyBaseTest
}else{
// use/return/extend/replace/??? from BaseTest
}
}
始终返回'0'。
我经历了另一种方式:
font.getColor()