使用JExcel时遇到字符编码问题。
我的应用程序从模板创建一个excel文档,并在将数据发送给用户之前用数据库中的数据(用当前和以前的会话用户输入填充)填充它。
在最终文档中,非{ASCII>来自模板的非ASCII字符(例如é
,è
,à
或°
未正确呈现(在生成的文档中,它们在模板中正确显示,而被�
替换,而数据库中的那些被正确编码。
我使用UTF-8进行用户输入(并输出到查看图层)以及数据库存储。
我在生成文件的类中使用此代码:
private void createFile(Arguments...)
throws IOException, BiffException, RowsExceededException, WriteException
{
File XLSFile = new File(MyPath);
WorkbookSettings XLSSettings = new WorkbookSettings()
XLSSettings.setEncoding(Constants.TEMPLATE_ENCODING)
// Constants.java is a class containing only app-wide constants declared as public static final
Workbook template = Workbook.getWorkbook(
new File(Constants.TEMPLATE_PATH));
WritableWorkbook userDocument =
Workbook.createWorkBook(XLSFile,template,XLSSettings);
template.close();
WritableSheet sheet = userDocument.getSheet(0);
...
Code that fills my workbook and sheet by creating new Labels and
adding them to my WritableSheet with sheet.add(Label)
...
userDocument.write();
userDocument.close();
}
Constants.TEMPLATE_ENCODING
已根据此问题中的建议设置为"Cp1252"
:Encoding problem in JExcel但无效。
尝试将其更改为"UTF-8"
也没有产生明显的变化。
该应用程序在每个级别都可以正常工作。 我想在打开和复制模板时尝试设置正确的编码并尝试更改此行
可能是个问题 Workbook template = Workbook.getWorkbook(new File(Constants.TEMPLATE_PATH);
到
Workbook template = Workbook.getWorkbook(new File(Constants.TEMPLATE_PATH, XLSSettings);
但它会在java.lang.System.arraycopy
中通过此行userDocument.write();
通过
java.lang.ArrayIndexOutOfBoundsException
java.lang.System.arraycopy(Native Method)
jxl.biff.StringHelper.getBytes(StringHelper.java:127)
jxl.write.biff.WriteAccessRecord.<init>(WriteAccessRecord.java:59)
jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:726)
com.mypackage.MyClass.createFile(MyClass.java:337)
任何人遇到过这个问题并知道如何修复它?
答案 0 :(得分:7)
我也遇到了这个问题。对我来说,解决方案非常简单。我只需要将我的WorkbookSettings放在TEMPLATE wb而不是新文件中。
//Load template workbook with settings
WorkbookSettings ws = new WorkbookSettings();
ws.setEncoding("Cp1252");
Workbook templateWorkbook = Workbook.getWorkbook(this.context.getAssets().open("template.xls"), ws);
//Create new workbook from templateWorkbook without settings
this.workbook = Workbook.createWorkbook(new File(this.location), templateWorkbook);
发现于:Android and JXL : ArrayIndexOutOfBoundException when create WritableWorkbook
此致