Java HSSFRichTextString样式未应用于具有默认值的单元格
我是POI新手,但面临着奇怪的问题。感谢任何快速的帮助Java HSSFRichTextString样式未应用于具有默认值的单元格,java,apache-poi,Java,Apache Poi,我是POI新手,但面临着奇怪的问题。感谢任何快速的帮助 RichTextString richString = new HSSFRichTextString( "SS 123 SS" ); richString.applyFont( 0, 3, font1 ); cell.setCellValue( richString ); 我有一个xls模板,其中每个单元格的字体都设置为Arial(字体大小:6.5)。 在我的应用程序中,我使用上述默认模板生成新的excel报告 Workbook w
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
我有一个xls模板,其中每个单元格的字体都设置为Arial(字体大小:6.5)。
在我的应用程序中,我使用上述默认模板生成新的excel报告
Workbook workbook = new HSSFWorkbook(InputStream s);
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
因此,新excel获得了“我的模板xls”中指定的所有属性(字体样式)
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
现在,当我使用HSSFRichTextString写入特定单元格时,它的样式不会被应用。 在包含文本和数字的单元格中,我想将文本设置为Arial,将数字设置为Terminal。例如SS 123 SS:Arial,123:Terminal。 但由于我的单元格默认字体样式为Arial,所以单元格中的所有内容都只写为Arial。 虽然当我在单元格中选择并检查123时,其描述字体为Terminal,但ion reality应用的字体仅为Arial
private static HSSFRichTextString formatNumbersOfCellText(String outputString,Font numberFont, Font strFont){
HSSFRichTextString formattedString = null;
try{
if(null != outputString && !outputString.trim().equalsIgnoreCase("")){
int lstIndexCalculated=0;
int startIndex ;
int endIndex;
String[] splittedArr = outputString.split("\\s");
if(null != splittedArr && splittedArr.length > 0){
formattedString = new HSSFRichTextString(outputString);
for (int i = 0; i < splittedArr.length; i++) {
if(lstIndexCalculated == 0){
startIndex = outputString.indexOf(splittedArr[i]);
}else{
startIndex = outputString.indexOf(splittedArr[i],lstIndexCalculated);
if(lstIndexCalculated < startIndex){
formattedString.applyFont(lstIndexCalculated,startIndex ,numberFont);
}
}
endIndex = startIndex + (splittedArr[i].length());
lstIndexCalculated = endIndex;
if(isNumericField(splittedArr[i])){
formattedString.applyFont(startIndex,endIndex ,numberFont);
}else{
formattedString.applyFont(startIndex,endIndex ,strFont);
}
startIndex = 0;
endIndex = 0;
}
if(lstIndexCalculated != 0){
return formattedString;
}
}
}
}catch(Exception e){
return null;
}
return null;
}
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
这很好,但在下面的情况下,多次迭代会产生问题
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
richString.applyFont( 3, 6, font2 );
richString.applyFont( 6, 9, font1 );
cell.setCellValue( richString );
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
正如您在终端字体的第1个链接(有效样式)中所看到的,字符“1”的下线。
但在Arial中,字符“1”没有被删除。因此,这是预期的行为。
但在我的例子中,如第二个链接(我不正确的xls样式),即使功能区将213.27显示为终端字体,它也不是。请参见图像中字符“1”之间的差异。
这就是我所指的
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
请帮忙。我完全被它挡住了。
提前谢谢,不确定你做错了什么
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
假设Source.xls
如下:
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
class ReadAndWriteRichText {
public static void main(String[] args) {
try {
InputStream inp = new FileInputStream("Source.xls");
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
Font font1 = wb.getFontAt(cell.getCellStyle().getFontIndex());
System.out.println(font1);
Font font2 = wb.createFont();
font2.setFontName("Terminal");
font2.setFontHeightInPoints(font1.getFontHeightInPoints());
System.out.println(font2);
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
//^0 ^3 ^6 ^9
richString.applyFont( 0, 3, font1 );
richString.applyFont( 3, 6, font2 );
richString.applyFont( 6, 9, font1 );
cell.setCellValue( richString );
FileOutputStream fileOut = new FileOutputStream("Target.xls");
wb.write(fileOut);
wb.close();
} catch (Exception ex) {
}
}
}
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
代码如下:
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
class ReadAndWriteRichText {
public static void main(String[] args) {
try {
InputStream inp = new FileInputStream("Source.xls");
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
Font font1 = wb.getFontAt(cell.getCellStyle().getFontIndex());
System.out.println(font1);
Font font2 = wb.createFont();
font2.setFontName("Terminal");
font2.setFontHeightInPoints(font1.getFontHeightInPoints());
System.out.println(font2);
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
//^0 ^3 ^6 ^9
richString.applyFont( 0, 3, font1 );
richString.applyFont( 3, 6, font2 );
richString.applyFont( 6, 9, font1 );
cell.setCellValue( richString );
FileOutputStream fileOut = new FileOutputStream("Target.xls");
wb.write(fileOut);
wb.close();
} catch (Exception ex) {
}
}
}
将导致如下所示的Target.xls
:
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
class ReadAndWriteRichText {
public static void main(String[] args) {
try {
InputStream inp = new FileInputStream("Source.xls");
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
Font font1 = wb.getFontAt(cell.getCellStyle().getFontIndex());
System.out.println(font1);
Font font2 = wb.createFont();
font2.setFontName("Terminal");
font2.setFontHeightInPoints(font1.getFontHeightInPoints());
System.out.println(font2);
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
//^0 ^3 ^6 ^9
richString.applyFont( 0, 3, font1 );
richString.applyFont( 3, 6, font2 );
richString.applyFont( 6, 9, font1 );
cell.setCellValue( richString );
FileOutputStream fileOut = new FileOutputStream("Target.xls");
wb.write(fileOut);
wb.close();
} catch (Exception ex) {
}
}
}
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
如您所见,123位于font终端中
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
根据您最新的问题,我提供了一个代码,该代码可以按需要工作:
RichTextString richString = new HSSFRichTextString( "SS 123 SS" );
richString.applyFont( 0, 3, font1 );
cell.setCellValue( richString );
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
class ReadAndWriteRichText {
private static boolean isNumeric(String string) {
try {
double d = Double.parseDouble(string);
} catch(NumberFormatException nfe) {
return false;
}
return true;
}
private static RichTextString formatNumbersOfCellText(String outputString, Font numberFont, Font strFont) {
RichTextString richString = new HSSFRichTextString(outputString);
String[] tokens = outputString.split("\\s"); // splits on a single space, so possibly empty strings are in the array
int start = 0;
int end = 0;
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i];
end = start + token.length();
if (i < tokens.length - 1) {
end = end + 1; // if not the last token, then take one character more than the length because of formatting the split-delimiter-space after the token
}
if (isNumeric(token)) {
richString.applyFont(start, end, numberFont);
} else {
richString.applyFont(start, end, strFont);
}
start = end;
}
return richString;
}
public static void main(String[] args) {
try {
InputStream inp = new FileInputStream("Source.xls");
Workbook wb = WorkbookFactory.create(inp);
Font font1 = wb.createFont();
font1.setFontName("Arial");
font1.setFontHeightInPoints((short)26);
Font font2 = wb.createFont();
font2.setFontName("Terminal");
font2.setFontHeightInPoints((short)26);
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
String cellValue = cell.getStringCellValue(); // all cells must be text cells
RichTextString richString = formatNumbersOfCellText(cellValue, font2, font1);
cell.setCellValue(richString);
}
}
FileOutputStream fileOut = new FileOutputStream("Target.xls");
wb.write(fileOut);
wb.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
import org.apache.poi.ss.usermodel.*;
导入org.apache.poi.hssf.usermodel.HSSFRichTextString;
导入java.io.InputStream;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
类ReadAndWriteRichText{
私有静态布尔值isNumeric(字符串){
试试{
double d=double.parseDouble(字符串);
}捕获(NumberFormatException nfe){
返回false;
}
返回true;
}
私有静态RichTextString格式NumberSofCellText(字符串输出字符串、字体编号字体、字体样式字体){
RichTextString richString=新的HSSFRichTextString(outputString);
String[]tokens=outputString.split(\\s”);//在单个空间上拆分,因此数组中可能有空字符串
int start=0;
int end=0;
for(int i=0;i
“现在,当我使用HSSFRichTextString写入特定单元格时,其样式将不被应用。”请向代码演示如何执行此操作。顺便说一句:formattedString.applyFont(startIndex、endIndex、strFont);其中,开始/结束索引是子字符串,我必须对其应用特定的fontHey,因为进一步分析发现MS Excel不将该样式应用于内容。但当我进行打印预览时,我可以看到应用于内容的富文本样式。任何具体原因??使用最新的finalApachePOI
版本3.15,我的答案中提供的代码对我来说都可以正常工作。你有哪些问题?换句话说:请描述您遇到的问题。感谢Alex提供的示例代码。我已经在上面的问题中添加了我的代码,用于将富文本格式应用于我单元格中的内容。我尝试了,但仍然没有成功。选择文本/数字后,excel显示应用的相应字体,但实际上仅应用ARIAL字体。虽然在打印预览时,我看到了正确的格式。整个单元格的字体(选择整个单元格时显示在功能区中)与单元格内的富文本字体(编辑单元格时显示在功能区中,然后取决于光标位置或部分选择)之间存在差异。富文本运行的字体在那里,但如果选择了整个单元格,则不会显示这些字体。是的。在基于光标位置的编辑模式中,显示终端字体应用于数字。但事实上,它并不是终端,它的Arial仅在我的情况下。“但事实上,它并不是终端,它的Arial仅”:问题是我们认为什么是“现实”;-)。如果它在ribbon中显示为Terminal,并将打印为Terminal,那么我会将其视为现实。为什么你认为它不是终端呢?