Java HSSFRichTextString样式未应用于具有默认值的单元格

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

我是POI新手,但面临着奇怪的问题。感谢任何快速的帮助

 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不将该样式应用于内容。但当我进行打印预览时,我可以看到应用于内容的富文本样式。任何具体原因??使用最新的final
ApachePOI
版本3.15,我的答案中提供的代码对我来说都可以正常工作。你有哪些问题?换句话说:请描述您遇到的问题。感谢Alex提供的示例代码。我已经在上面的问题中添加了我的代码,用于将富文本格式应用于我单元格中的内容。我尝试了,但仍然没有成功。选择文本/数字后,excel显示应用的相应字体,但实际上仅应用ARIAL字体。虽然在打印预览时,我看到了正确的格式。整个单元格的字体(选择整个单元格时显示在功能区中)与单元格内的富文本字体(编辑单元格时显示在功能区中,然后取决于光标位置或部分选择)之间存在差异。富文本运行的字体在那里,但如果选择了整个单元格,则不会显示这些字体。是的。在基于光标位置的编辑模式中,显示终端字体应用于数字。但事实上,它并不是终端,它的Arial仅在我的情况下。“但事实上,它并不是终端,它的Arial仅”:问题是我们认为什么是“现实”;-)。如果它在ribbon中显示为Terminal,并将打印为Terminal,那么我会将其视为现实。为什么你认为它不是终端呢?