我想用黑体和斜体组合设置单元格值的内容。 像“这是 示例 内容。”
但是,使用XSSFRichTextString不能正常工作。
我正在使用apache poi库4.0.1版。我尝试使用XSSFRichTextString使内容加粗和斜体组合。我通过在cell1Value.append(“ sample”,fontBold)方法中传递两个参数来附加字符串。字符串和字体。
GetSessionToken
我希望“样本”为粗体,“内容”为斜体。但是,下划线工作正常,并且我的“示例”字词已正确下划线。请提出我想念的东西吗?
答案 0 :(得分:1)
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class TextBoldItalic {
public static void main(String[] args) throws Exception {
XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
XSSFFont fontBold = wb.createFont();
fontBold.setBold(true);
XSSFFont fontItalic = wb.createFont();
fontItalic.setItalic(true);
XSSFFont fontBoldItalic = wb.createFont();
fontBoldItalic.setBold(true);
fontBoldItalic.setItalic(true);
XSSFRichTextString cellValue = new XSSFRichTextString();
cellValue.append("This is ", fontBold);
cellValue.append("sample ", fontItalic);
cellValue.append("content", fontBoldItalic);
cell.setCellValue(cellValue);
OutputStream fileOut = new FileOutputStream("TextBoldItalic.xlsx");
wb.write(fileOut);
wb.close();
}
}
此代码对我有用,并在LibreOffice中给了我this result。 OpenOffice也可以。没有MS Excel在这里进行测试,抱歉。当然,Online-Excel-Viewer这样的工具将无法正确执行。因此,请尝试我的代码并进行报告。
答案 1 :(得分:0)
代码看起来合理,只需执行完整的运行即可:
以下我测试过的
有效。
try (XSSFWorkbook wb = new XSSFWorkbook()) {
XSSFSheet sheet = wb.createSheet("With Rich Text");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
XSSFFont fontPlain = wb.createFont();
XSSFFont fontBoldItalic = wb.createFont();
fontBoldItalic.setBoldItalic(true);
fontBoldItalic.setItalic(true);
XSSFFont fontItalic = wb.createFont();
fontItalic.setItalic(true);
XSSFRichTextString cell1Value= new XSSFRichTextString("This is ");
cell1Value.applyFont(fontPlain);
cell1Value.append("sample ", fontBoldItalic);
cell1Value.append("content", fontItalic);
cell.setCellValue(cell1Value);
wb.write(new FileOutputStream(xlsxFile));
} catch (IOException e) {
e.printStackTrace();
}
我的猜测是变量混淆或琐碎的事情。也许是字体。
答案 2 :(得分:0)
使用WPS Spreadsheets
的问题在于它们声称与Excel
最兼容,但有时它们完全失败。这次,如果它们明确设置为true,则它们会误解所有布尔字体设置(粗体,斜体,粗体)。
Office Open XML
提供具有val
属性的布尔元素。示例:<b val="true"/>
或<b val="false"/>
或<b val="1"/>
或<b val="0"/>
。但是对于具有<b/>
的设置粗体字体就足够了。对于不设置粗体的字体,根本不使用b
元素就足够了。
Apache poi
始终将<b val="true"/>
设置为粗体,将<b val="false"/>
设置为非粗体。但是WPS Spreadsheets
现在似乎误解了<b val="true"/>
。它仅预期<b/>
。
以下代码是用于为Excel
创建富文本字符串的最兼容的代码。它支持Office Open XML (*.xlsx)
和BIFF (*.xls)
,并且仅将<Boolean val="true"/>
纠正为<Boolean/>
。
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBooleanProperty;
class CreateExcelRichText {
static RichTextString createRichTextString(Workbook workbook, String[] textParts, Font[] fonts) {
CreationHelper creationHelper = workbook.getCreationHelper();
RichTextString richTextString = creationHelper.createRichTextString(String.join("", textParts));
int start = 0;
int end = 0;
for (int tp = 0; tp < textParts.length; tp ++) {
Font font = null;
if (tp < fonts.length) font = fonts[tp];
end += textParts[tp].length();
if (font != null) richTextString.applyFont(start, end, font);
start += textParts[tp].length();
}
if (richTextString instanceof XSSFRichTextString) {
//unset val="true" for boolean objects
XSSFRichTextString xSSFRichTextString = (XSSFRichTextString)richTextString;
String[] boolenanObjectsToUnset = new String[]{"b", "i", "strike"};
for (String boolenanObjectToUnset : boolenanObjectsToUnset) {
XmlObject[] xmlObjects = xSSFRichTextString.getCTRst().selectPath(
"declare namespace main='http://schemas.openxmlformats.org/spreadsheetml/2006/main' " +
".//main:" + boolenanObjectToUnset);
for (XmlObject xmlObject : xmlObjects) {
CTBooleanProperty booleanProperty = (CTBooleanProperty)xmlObject;
if (booleanProperty.getVal()) booleanProperty.unsetVal();
}
}
}
return richTextString;
}
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
//Workbook workbook = new HSSFWorkbook();
Font font = workbook.createFont();
Font fontBoldItalic = workbook.createFont();
fontBoldItalic.setBold(true);
fontBoldItalic.setItalic(true);
Font fontItalic = workbook.createFont();
fontItalic.setItalic(true);
Font fontStrikeout = workbook.createFont();
fontStrikeout.setStrikeout(true);
String[] textParts = new String[]{"This is ", "Sample ", "content. ", "This is crossed out."};
Font[] fonts = new Font[]{font, fontBoldItalic, fontItalic, fontStrikeout};
RichTextString richTextString = createRichTextString(workbook, textParts, fonts);
Sheet sheet = workbook.createSheet();
sheet.createRow(0).createCell(0).setCellValue(richTextString);
String fileName = (workbook instanceof XSSFWorkbook)?"Excel.xlsx":"Excel.xls";
FileOutputStream out = new FileOutputStream(fileName);
workbook.write(out);
out.close();
workbook.close();
}
}