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);