为什么 XSSFRichTextString.applyFont() 不像 java 文档中所写的那样工作?
Why does not XSSFRichTextString.applyFont() work as it is written in java doc?
我正在尝试对字符串的一部分应用粗体并将其放入单元格中。
XSSFFont font = workbook.createFont();
font.setBold(true);
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
XSSFCell c = nextRow.createCell(4);
c.setCellStyle(style);
XSSFRichTextString string = new XSSFRichTextString(report.getSurroundText());
string.applyFont( startIndex, getEndOfWord(startIndex, report.getFoundWord()), font);
c.setCellValue(string);
此代码作为我生成 .xlsx
文件的代码的一部分,它确实生成了一个未损坏的文件,但本应为粗体的文本不正确。相反,它突出显示从文本开头到我在 applyFont()
方法中设置为结束索引的索引。基本上由于某种原因 startIndex
被忽略了。
在调试期间,startIndex
和 getEndOfWord()
的 return 值都是正确的。
编辑:
try(FileOutputStream fileOut = new FileOutputStream(new File(directory.getAbsoluteFile() + File.separator +
FilenameUtils.getBaseName(csvFile.getAbsolutePath()) + ".xlsx"));) {
try (XSSFWorkbook workbook = new XSSFWorkbook()) {
XSSFSheet sheet = workbook.createSheet("Highlights");
XSSFRow headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue(firstLine);
XSSFRow titleRow = sheet.createRow(1);
titleRow.createCell(0).setCellValue(SCANID);
titleRow.createCell(1).setCellValue(DOCID);
titleRow.createCell(2).setCellValue(FOUNDWORD);
titleRow.createCell(3).setCellValue(OFFSET);
titleRow.createCell(4).setCellValue(SURROUNDTEXT);
XSSFFont font = workbook.createFont();
font.setBold(true);
XSSFFont deFont = workbook.createFont();
font.setBold(false);
int row = 2;
for (MuiDetailReport report : lst) {
XSSFRow nextRow = sheet.createRow(row);
nextRow.createCell(0).setCellValue(report.getScanId());
nextRow.createCell(1).setCellValue(report.getDocId());
nextRow.createCell(2).setCellValue(report.getFoundWord());
if (report.getOffset() != 0) nextRow.createCell(3).setCellValue(report.getOffset());
else nextRow.createCell(3).setCellValue("");
if (!report.getFoundWord().isBlank() && !report.getSurroundText().isBlank()) {
int startIndex = getStartOfWord(report.getFoundWord(), report.getSurroundText());
if (startIndex == -1) nextRow.createCell(4).setCellValue("");
else {
XSSFCell c = nextRow.createCell(4);
XSSFRichTextString string = new XSSFRichTextString(report.getSurroundText());
string.applyFont(startIndex, getEndOfWord(startIndex, report.getFoundWord()), font);
c.setCellValue(string);
}
} else nextRow.createCell(4).setCellValue("");
row++;
}
workbook.write(fileOut);
}
fileOut.flush();
}
这是我创建 .xlsx
文件的方法。方法参数:String firstLine, List<MuiDetailReport> lst, File csvFile
。所有大写字符的变量是 static final String
我的结果是“HellomynameisThad”而不是 "HellomynameisThad"
我通过 不将 CellStyle
应用于单元格而只是将 XSSFRichTextString
设置为单元格值来实现它。
查看此示例,它假设已经创建了一个 XSSFWorkbook
和一个 XSSFSheet
:
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
XSSFFont boldFont = new XSSFFont();
boldFont.setBold(true);
XSSFRichTextString rts = new XSSFRichTextString("BVB BVB BVB");
rts.applyFont(4, 7, boldFont);
cell.setCellValue(rts);
我省略了将工作簿写入文件系统的部分,我想你的已经可以了。
结果是第一个/左上角单元格中有 "BVB BVB BVB" 的工作簿。
这是我的 pom.xml(maven 项目)的一部分,其中设置了 apache poi 依赖项,也许您有它的旧版本:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.0</version>
</dependency>
让我们真正地Minimal, Reproducible Example。
以下应导致文本
HellomynameisThad
在单元格 A1
中。
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
class CreateExcelBoldWord {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
//Workbook workbook = new HSSFWorkbook();
String fileName = (workbook instanceof XSSFWorkbook)?"Excel.xlsx":"Excel.xls";
CreationHelper creationHelper = workbook.getCreationHelper();
Font font = workbook.createFont(); // default font
Font fontBold = workbook.createFont();
fontBold.setBold(true);
String text = "HellomynameisThad";
String word = "name";
RichTextString richTextString = creationHelper.createRichTextString(text);
int startIndex = text.indexOf(word);
int endIndex = startIndex + word.length();
richTextString.applyFont(startIndex, endIndex, fontBold);
Sheet sheet = workbook.createSheet();
sheet.createRow(0).createCell(0).setCellValue(richTextString);
FileOutputStream out = new FileOutputStream(fileName);
workbook.write(out);
out.close();
workbook.close();
}
}
没有?
我正在尝试对字符串的一部分应用粗体并将其放入单元格中。
XSSFFont font = workbook.createFont();
font.setBold(true);
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
XSSFCell c = nextRow.createCell(4);
c.setCellStyle(style);
XSSFRichTextString string = new XSSFRichTextString(report.getSurroundText());
string.applyFont( startIndex, getEndOfWord(startIndex, report.getFoundWord()), font);
c.setCellValue(string);
此代码作为我生成 .xlsx
文件的代码的一部分,它确实生成了一个未损坏的文件,但本应为粗体的文本不正确。相反,它突出显示从文本开头到我在 applyFont()
方法中设置为结束索引的索引。基本上由于某种原因 startIndex
被忽略了。
在调试期间,startIndex
和 getEndOfWord()
的 return 值都是正确的。
编辑:
try(FileOutputStream fileOut = new FileOutputStream(new File(directory.getAbsoluteFile() + File.separator +
FilenameUtils.getBaseName(csvFile.getAbsolutePath()) + ".xlsx"));) {
try (XSSFWorkbook workbook = new XSSFWorkbook()) {
XSSFSheet sheet = workbook.createSheet("Highlights");
XSSFRow headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue(firstLine);
XSSFRow titleRow = sheet.createRow(1);
titleRow.createCell(0).setCellValue(SCANID);
titleRow.createCell(1).setCellValue(DOCID);
titleRow.createCell(2).setCellValue(FOUNDWORD);
titleRow.createCell(3).setCellValue(OFFSET);
titleRow.createCell(4).setCellValue(SURROUNDTEXT);
XSSFFont font = workbook.createFont();
font.setBold(true);
XSSFFont deFont = workbook.createFont();
font.setBold(false);
int row = 2;
for (MuiDetailReport report : lst) {
XSSFRow nextRow = sheet.createRow(row);
nextRow.createCell(0).setCellValue(report.getScanId());
nextRow.createCell(1).setCellValue(report.getDocId());
nextRow.createCell(2).setCellValue(report.getFoundWord());
if (report.getOffset() != 0) nextRow.createCell(3).setCellValue(report.getOffset());
else nextRow.createCell(3).setCellValue("");
if (!report.getFoundWord().isBlank() && !report.getSurroundText().isBlank()) {
int startIndex = getStartOfWord(report.getFoundWord(), report.getSurroundText());
if (startIndex == -1) nextRow.createCell(4).setCellValue("");
else {
XSSFCell c = nextRow.createCell(4);
XSSFRichTextString string = new XSSFRichTextString(report.getSurroundText());
string.applyFont(startIndex, getEndOfWord(startIndex, report.getFoundWord()), font);
c.setCellValue(string);
}
} else nextRow.createCell(4).setCellValue("");
row++;
}
workbook.write(fileOut);
}
fileOut.flush();
}
这是我创建 .xlsx
文件的方法。方法参数:String firstLine, List<MuiDetailReport> lst, File csvFile
。所有大写字符的变量是 static final String
我的结果是“HellomynameisThad”而不是 "HellomynameisThad"
我通过 不将 CellStyle
应用于单元格而只是将 XSSFRichTextString
设置为单元格值来实现它。
查看此示例,它假设已经创建了一个 XSSFWorkbook
和一个 XSSFSheet
:
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
XSSFFont boldFont = new XSSFFont();
boldFont.setBold(true);
XSSFRichTextString rts = new XSSFRichTextString("BVB BVB BVB");
rts.applyFont(4, 7, boldFont);
cell.setCellValue(rts);
我省略了将工作簿写入文件系统的部分,我想你的已经可以了。
结果是第一个/左上角单元格中有 "BVB BVB BVB" 的工作簿。
这是我的 pom.xml(maven 项目)的一部分,其中设置了 apache poi 依赖项,也许您有它的旧版本:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.0</version>
</dependency>
让我们真正地Minimal, Reproducible Example。
以下应导致文本
HellomynameisThad
在单元格 A1
中。
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
class CreateExcelBoldWord {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
//Workbook workbook = new HSSFWorkbook();
String fileName = (workbook instanceof XSSFWorkbook)?"Excel.xlsx":"Excel.xls";
CreationHelper creationHelper = workbook.getCreationHelper();
Font font = workbook.createFont(); // default font
Font fontBold = workbook.createFont();
fontBold.setBold(true);
String text = "HellomynameisThad";
String word = "name";
RichTextString richTextString = creationHelper.createRichTextString(text);
int startIndex = text.indexOf(word);
int endIndex = startIndex + word.length();
richTextString.applyFont(startIndex, endIndex, fontBold);
Sheet sheet = workbook.createSheet();
sheet.createRow(0).createCell(0).setCellValue(richTextString);
FileOutputStream out = new FileOutputStream(fileName);
workbook.write(out);
out.close();
workbook.close();
}
}
没有?