`

使用JXL生成Excel时发生java.lang.ArrayIndexOutOfBoundsException错误

    博客分类:
  • JXL
 
阅读更多

错误信息如下:

......

java.lang.ArrayIndexOutOfBoundsException
        at java.lang.System.arraycopy(Native Method)
        at jxl.biff.StringHelper.getBytes(StringHelper.java:127)
        at jxl.write.biff.WriteAccessRecord.<init>(WriteAccessRecord.java:59)
        at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:726)

......

 

根据错误信息的提示,发现问题出在WriteAccessRecord文件里,其源代码如下所示:
package jxl.write.biff;

import jxl.Workbook;
import jxl.biff.StringHelper;
import jxl.biff.Type;
import jxl.biff.WritableRecordData;
/**
* The name used when Excel was installed.
* When writing worksheets, it uses the value from the WorkbookSettings object,
* if this is not set (null) this is hard coded as
* Java Excel API + Version number
*/
class WriteAccessRecord extends WritableRecordData {
/**
* The data to output to file
*/
 private byte[] data;
// String of length 112 characters
/**
* The author of this workbook (ie. the Java Excel API)
*/
 private final static String authorString = "Java Excel API";
 private String userName;
/**
 * Constructor
 */
 public WriteAccessRecord(String userName) {
 super(Type.WRITEACCESS);

  data = new byte[112];
  String astring = userName != null ?
  userName :
  authorString + " v" + Workbook.getVersion();
 StringHelper.getBytes(astring, data, 0);

 // Pad out the record with space characters
 for (int i = astring.length() ; i < data.length ;i++) {
  data[i] = 0x20;
 }
}

 /**
 * Gets the data for output to file
 *
 * @return the binary data
 */
  public byte[] getData() {
  return data;
  }
}
 

分析上诉代码发现,byte数组data的最大长度被定义为112,当被传入的参数userName达到一定长度时就会抛错。

跟踪代码WritableWorkbookImpl发现,userName实际就是WorkbookSettings类中的writeAccess字段,亦即生成Excel是的用户信息。可能在linux环境UTF8下每个汉字的字节数为3位(Windows中是2位)的缘故,出现了上诉的奇异现象。

解决的办法如下:

1.修改JXL源代码中WriteAccessRecord文件代码,重新设置变量data的长度,例如:data = new byte[astring.getBytes().length];

2.一般我们在读取模板文件生成新的Excel时往往使用如下代码:


import java.io.File; 
 
import jxl.Workbook; 
import jxl.write.WritableSheet; 
import jxl.write.WritableWorkbook;   
public class Test { 
 
    public static void main(String[] args) throws Exception { 
 
        Workbook wb = Workbook.getWorkbook(new File("C:/data_template.xls")); 
        WritableWorkbook workbook = Workbook.createWorkbook(new File("C:/data_output.xls"), wb); 
         
        WritableSheet sheet = workbook.getSheet(3); 
        sheet.getSettings().setSelected(true); 
         
       workbook.write(); 
        workbook.close(); 
    } 

只要在代码中强制设置变量WorkbookSettings.writeAccess的值即可,例如:
File file = new File("data/lglk/excle/LandNeed.xls");
Workbook workbook = Workbook.getWorkbook(file);    
OutputStream outputStream = new FileOutputStream(new File(path));         
WorkbookSettings wbSettings = new WorkbookSettings (); 
wbSettings.setWriteAccess(null);          
// 工作表
WritableWorkbook writableWorkbook = Workbook.createWorkbook(os, workbook,wbSettings);
// 写入文件
writableWorkbook.write();
writableWorkbook.close();
workbook.close();
os.close();

 

分享到:
评论

相关推荐

    java使用jxl打印excel报表文件

    在Java开发中,生成和处理Excel文件是一项常见的任务,特别是在数据导出或报表生成的场景。JXL库是一个广泛使用的Java库,它允许开发者读取、写入和修改Excel文件。本篇将深入探讨如何使用JXL库在Java中打印Excel...

    Java操作Excel(jxl.jar)

    本篇文章将深入探讨如何使用jxl.jar库来实现Java操作Excel。 首先,jxl是一个广泛使用的Java库,它允许开发者读写Microsoft Excel文件。它的主要优势在于简单易用且功能丰富,支持多种Excel格式,包括老版本的.BIFF...

    jxl.zip_excel_jxl_jxl.biff.drawing.dg_jxl.biff.drawingdg

    "jxl.zip"指的是包含JXL库的压缩文件,它是一个Java库,用于处理Excel文件。"jxl.biff.drawing.dg"和"jxl.biff.drawingdg"则涉及到Excel文件内部的结构,BIFF(Binary Interchange File Format)是Excel的二进制文件...

    java利用jxl生成excel文件

    Java使用JXL库生成Excel文件是一项常见的任务,特别是在数据处理、报表生成或导出时。JXL是一个开源的Java库,允许我们读取、写入和修改Excel文件。以下将详细讲解如何使用JXL库来生成Excel文件。 首先,我们需要在...

    关于jxl操作excel说明以及jxl.jar包下载2.6

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、数据分析或者报表生成时。JXL库是一个广泛使用的开源库,它允许开发者用Java来读写Microsoft Excel文件。标题"关于jxl操作excel说明以及...

    jxl模版生成excel

    "jxl模版生成excel" 指的是使用JExcelAPI(简称jxl)这个Java库来创建基于模板的Excel文件。JExcelAPI是一个开源项目,允许程序开发者读写Microsoft Excel文件,它支持从Java数据结构直接导出到Excel格式,同时也可...

    jxl方式生成excel表格.zip

    本资源提供了一个利用jxl库实现Java程序中生成Excel表格的解决方案。jxl是一个广泛使用的开源Java库,它允许开发者读取、写入和修改Microsoft Excel文件。 首先,我们来详细了解一下jxl库。jxl库支持多种Excel操作...

    使用jxl解析excel(.xls)固定模板(智联简历为例)

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、数据分析或者报表生成时。JXL库是一个广泛使用的开源库,它允许开发者读写Microsoft Excel格式的文件,包括.xls格式。本教程将深入讲解...

    java_Jxl(导入导出Excel).doc

    在使用Jxl之前,你需要先下载jxl.jar文件,将其添加到项目的classpath中。安装过程非常简单,只需将jar文件解压缩并引入到项目即可。 创建Excel文件是通过`Workbook.createWorkbook()`方法实现的。以下是一个创建...

    java_Jxl(导入导出Excel).pdf

    使用Jxl库前,首先需要下载jxl.jar文件。将其解压后,将jxl.jar添加到项目的classpath中,即可完成安装。 **创建Excel文件** 创建Excel文件的过程非常直观。以下是一个简单的例子,展示了如何生成一个包含"测试数据...

    jxl导出excel加水印.zip

    本教程将详细介绍如何使用`jxl`库在导出Excel时添加水印,以及涉及的核心类`WritableWorkbook`、`WritableSheet`和`WritableCellFormat`。 `jxl`库提供了一套完整的API来操作Excel文件,包括创建新的工作簿、添加...

    使用jxl.jar在Android中操作Excel表格

    这里我们将深入探讨如何使用jxl.jar库在Android环境中操作Excel表格,特别是处理隐藏表的情况。 首先,jxl是一个Java库,它允许我们以编程方式读取和写入Microsoft Excel文件。由于Android系统基于Java,因此可以...

    jxl创建下拉列表

    ### jxl创建下拉列表知识点解析 #### 一、jxl概述 jxl 是一个用于读写Microsoft Excel 文件的Java库。它支持多种版本的Excel文件...此外,还可以根据实际需求添加更多的样式和特性,使得生成的Excel文件更加符合预期。

    NoClassDefFoundError: jxl/WorkbookSettings

    标题 "NoClassDefFoundError: jxl/WorkbookSettings" 是一个常见的Java运行时错误,意味着在尝试执行程序时,系统无法找到某个类的定义。这个错误通常发生在类路径(ClassPath)配置不正确或者缺少了必要的库依赖时...

    java生成excel实例通过(jxl)

    本实例将详细介绍如何使用JXL库在Java中生成、读取、复制和修改Excel文件。 首先,我们需要在项目中引入JXL库。如果使用Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;...

    poi jxl 生成EXCEL 报表

    在Java编程环境中,生成Excel报表是一项常见的任务,尤其在数据处理和数据分析中。Apache POI 和 JExcelAPI(JXL)是两个广泛使用的库,分别用于处理Microsoft Office的POI格式(包括Excel)和Java环境中的Excel文件...

    jxl.jar 用于java读取 .xls 文件

    在这种情况下,`jxl.jar`库是一个非常实用的工具,它允许开发者用Java轻松地读取和写入Excel文件。`jxl.jar`库提供了丰富的API,使得操作Excel文件变得简单而高效。 `jxl`库的核心概念是工作簿(Workbook)、工作表...

    解决JXL调用copySheet()和importSheet()方法时报异常的jar包

    at jxl.write.biff.WritableSheetCopier.shallowCopyCells(WritableSheetCopier.java:499) [jxl.ja r:na] at jxl.write.biff.WritableSheetCopier.copySheet(WritableSheetCopier.java:239) [jxl.jar:na] at ...

Global site tag (gtag.js) - Google Analytics