日期:2014-05-20  浏览次数:20778 次

POI 取Excel字体的问题(欢迎大家进来交流一下,在线等,。。。。ps:领导下达了死命令 诶)
问题描述如下:
公司需要做个小工具,来检查Excel文档的字体(主要给翻译用的)。
我用Java swing做了一个,处理Excel文档用的是POI。本来好好的,也没什么问题,突然翻译那边测出了一个BUG,我改了好几天也没什么头绪。
代码如下: 
....//前面的省掉,就是几个循环(先遍历sheet,在遍历Row,得到一行)
HSSFRow aRow = aSheet.getRow(rowNumOfSheet);
for (short cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) {//遍历单元格

HSSFCell aCell = aRow.getCell(cellNumOfRow);//取得一个单元格

HSSFRichTextString str = new HSSFRichTextString();//1.这个 不知道啥意思 网上看来的?

HSSFFont cellFont = workbook.getFontAt(aCell.getCellStyle().getFontIndex());//得到单元格的字体
int cellType = aCell.getCellType();//得到单元格的类型
String strCell = "";
switch (cellType) {
case 0 :// Numeric
{strCell = df.format(aCell.getNumericCellValue());break;}
case 1 :// String
{
str = aCell.getRichStringCellValue();
strCell = str.getString();
break;
}
default :
}
for (int p = 0; p < str.length(); p++) {//遍历单元格里
String strFont = (workbook.getFontAt(str.getFontAtIndex(p))).getFontName();//这句出大问题了
/*
问题1.这句愿意是得到单元格内容 中 每一个字符的字体,我式了下,可以。但是,一但全选了 sheet(就是点最左上角的单元格),再设置成另外一种字体,他检查出来的 还是原来的字体,就是修改以前的字体。
  2.后来,我把Excel文件另存为xml,看了下它的结构。大致如下:
  <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
  <Alignment ss:Vertical="Bottom"/>
  <Borders/>
  <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
  <Interior/>
  <NumberFormat/>
  <Protection/>
  </Style>
  <Style ss:ID="s21">
  <Font ss:FontName="MS Gothic" x:CharSet="128" x:Family="Modern" ss:Size="12"/>
  </Style>
 </Styles> //一开始 有几个通用的样式定义

<Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="18" x:FullColumns="1"
  x:FullRows="1" ss:StyleID="s21" ss:DefaultColumnWidth="54"
  ss:DefaultRowHeight="14.25">
  <Row ss:Index="11">
  <Cell ss:Index="4"><ss:Data ss:Type="String"
  xmlns="http://www.w3.org/TR/REC-html40">大法<Font html:Face="宋体"  
  x:CharSet="134">师发</Font><Font>大水打法</Font></ss:Data></Cell>
  </Row>
  <Row>
  <Cell ss:Index="4"><Data ss:Type="String"> 收到</Data></Cell>
  </Row>
  ....
  

翻译全选修改字体后(设置成MS Gothic),但是我还是得到的 “宋体” 这里是不是样式嵌套乱了还是怎么回事? 
到底有没有更好的方法来解决这个问题呢(取得单元格里某个字符的字体)?望高手赐教!
*/

//....下面不写了
}

------解决方案--------------------
字符-cell-Row-Column-Table的字体有优先级的吧
取存在的且优先级最高的那个
------解决方案--------------------
不会,帮你顶啦
------解决方案--------------------
关注
------解决方案--------------------
Java code
    HSSFWorkbook wb = new HSSFWorkbook();// ??b??HSSFWorkbook????
        HSSFSheet sheet = wb.createSheet("report");// ??b?µ?sheet????
        HSSFRow row = null;
        HSSFCell cell = null;
        String[][] data = ExpExcelServlet.data;
        ShowStyleForm form = ExpExcelServlet.forms;
        List<ShowStyleForm> showS = ExpExcelServlet.showStyle;
        sheet.setDefaultColumnWidth((short) 10);
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setRightBorderColor(HSSFColor.BLACK.index);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setTopBorderColor(HSSFColor.BLACK.index);

        // ????????
        HSSFFont font = wb.createFont();
        font.setFontHeightInPoints((short) 11);
        font.setFontName("????");
        font.setItalic(false);
        font.setStrikeout(false);
        style.setFont(font);

        HSSFCellStyle style1 = wb.createCellStyle();
        style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style1.setBottomBorderColor(HSSFColor.BLACK.index);
        style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style1.setLeftBorderColor(HSSFColor.BLACK.index);
        style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style1.setRightBorderColor(HSSFColor.BLACK.index);
        style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style1.setTopBorderColor(HSSFColor.BLACK.index);

        // ????????
        HSSFFont font1 = wb.createFont();
        font1.setFontHeightInPoints((short) 11);
        font1.setFontName("????");
        font1.setColor(HSSFColor.RED.index);
        style1.setFont(font1);