0 0

jxl.write.WritableWorkbook 不支持多线程0


在使用 jxl.write.WritableWorkbook 将数据导出成excel文件的过程中,发现在继承 Thread 类生成的excel中并没有数据(在查询的时候是有数据的)。

如果将类 UserExcelExport 声明为 不 继承 Thread,导出的excel中是有数据的。
这是什么一回事呢?

 

代码如下:

 

action:

public void exportUserTest() {

		LOG.info("start to export userTest.");
		// 获取查询表单中的查询条件
		String userName = (String) getSearchValue().get("userName");
		userName = userName == null ? null : userName.trim();

		StringBuffer sqlBuf = new StringBuffer(
				"select * from user_test where 1=1 ");

		if (null != userName && !"".equals(userName)) {
			sqlBuf.append(" and USER_NAME like '%" + userName + "%'");
		}

		LOG.info("search condition: userName=" + userName);

		List<UserTest> list = null;
		try {
			list = userTestService.queryList(sqlBuf.toString());
		} catch (Exception e) {
			LOG.error("query usertest list fail!", e);
		}

		String[] head = new String[] { "用户ID", "用户名", "年龄", "注册时间" };

		HttpServletResponse resp = ServletActionContext.getResponse();
		OutputStream os = null;
		try {
			os = resp.getOutputStream();
			String name = "用户信息";
			resp.reset();
			byte[] fileNameByte = (name + ".xls").getBytes("GBK");
			String fileName = new String(fileNameByte, "ISO8859-1");
			resp.setHeader("Content-disposition", "attachment; filename="
					+ fileName);
			resp.setContentType("application/msexcel");

			UserExcelExport export = new UserExcelExport(os, name, head, list);
			
			Thread thread = new Thread(export);
			
			thread.start();

		} catch (IOException e) {
			LOG.error("get OutputStream faile!", e);
		} catch (Exception e) {
			LOG.error("export usertest fail!", e);
		} finally {
			try {
				if (null != os) {
					os.close();
				}
			} catch (IOException e) {
				LOG.error("close OutputStream faile!", e);
			}
		}

		LOG.info("end to export userTest.");
	}

 

导出excel的类

 

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import org.apache.log4j.Logger;

import jxl.Workbook;
import jxl.write.WritableFont;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class UserExcelExport extends Thread {
	
	private static Logger log = Logger.getLogger(UserExcelExport.class);

	private OutputStream _os;
	private String _subject;
	private String[] _titles;
	private List<?> _list;

	public UserExcelExport() {
	}

	public UserExcelExport(OutputStream os, String subject, String[] titles,
			List<?> list) {

		this._os = os;
		this._subject = subject;
		this._titles = titles;
		this._list = list;
	}

	public void run() {

		createOutPutStreamForObjs(_os, _subject, _titles, _list);
	}

	public void createOutPutStreamForObjs(OutputStream os, String subject,
			String[] titles, List<?> list) {
		
		jxl.write.WritableWorkbook wwb = null;
		try {
			wwb = Workbook.createWorkbook(os);
			int number = 0;
			int num = 50000;

			while ((number + 1) * num <= list.size()) {
				jxl.write.WritableSheet ws = wwb.createSheet(subject + number,
						number);

				// 表格头
				// 添加带有字型Formatting的对象
				jxl.write.WritableFont wfTitle = new jxl.write.WritableFont(
						WritableFont.TAHOMA, 12, WritableFont.BOLD, false);
				jxl.write.WritableCellFormat wcfFTitle = new jxl.write.WritableCellFormat(
						wfTitle);
				for (int i = 0; i < titles.length; i++) {
					jxl.write.Label labelCFTitle = new jxl.write.Label(i, 0,
							titles[i], wcfFTitle);
					ws.addCell(labelCFTitle);
				}

				// 表格内容
				jxl.write.WritableFont wf = new jxl.write.WritableFont(
						WritableFont.TAHOMA, 11, WritableFont.NO_BOLD, false);
				jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(
						wf);
				int numI = 0;
				for (int i = number * num; i < (number + 1) * num; i++) {
					Object[] subList = (Object[]) list.get(i);
					for (int j = 0; j < subList.length; j++) {
						String text = subList[j] == null ? "" : subList[j]
								.toString();
						jxl.write.Label labelCF = new jxl.write.Label(j,
								numI + 1, text, wcfF);
						ws.addCell(labelCF);
					}
					numI++;
				}
				number = number + 1;
			}

			if (list.size() > number * num) {
				jxl.write.WritableSheet ws = wwb.createSheet(subject + number,
						number);

				// 表格头
				// 添加带有字型Formatting的对象
				jxl.write.WritableFont wfTitle = new jxl.write.WritableFont(
						WritableFont.TAHOMA, 12, WritableFont.BOLD, false);
				jxl.write.WritableCellFormat wcfFTitle = new jxl.write.WritableCellFormat(
						wfTitle);
				for (int i = 0; i < titles.length; i++) {
					jxl.write.Label labelCFTitle = new jxl.write.Label(i, 0,
							titles[i], wcfFTitle);
					ws.addCell(labelCFTitle);
				}

				// 表格内容
				jxl.write.WritableFont wf = new jxl.write.WritableFont(
						WritableFont.TAHOMA, 11, WritableFont.NO_BOLD, false);
				jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(
						wf);
				int numI = 0;
				for (int i = number * num; i < list.size(); i++) {
					Object[] subList = (Object[]) list.get(i);
					for (int j = 0; j < subList.length; j++) {
						String text = subList[j] == null ? "" : subList[j]
								.toString();
						jxl.write.Label labelCF = new jxl.write.Label(j,
								numI + 1, text, wcfF);
						ws.addCell(labelCF);
					}
					numI++;
				}
			}
			// 写入Exel工作表
			wwb.write();

		} catch (RowsExceededException e) {
			log.error("RowsExceededException.", e);
		} catch (FileNotFoundException e) {
			log.error("FileNotFoundException.", e);
		} catch (WriteException e) {
			log.error("WriteException.", e);
		} catch (IOException e) {
			log.error("IOException.", e);
		} catch(Exception e){
			log.error("Others Exception.", e);
		}finally {
			// 关闭Excel工作薄对象
			try {
				if (wwb != null) {
					wwb.close();
				}
				if (null != os) {
					os.close();
				}
			} catch (WriteException e) {
				log.error("WriteException.", e);
			} catch (IOException e) {
				log.error("IOException.", e);
			}
		}
	}
}
 

 

 

 

2012年6月20日 14:16

1个答案 按时间排序 按投票排序

0 0

和Thread没有关系,建议重试一下。

2012年6月20日 15:49

相关推荐

    java中导出Execl所需jxl依赖包

    jxl导出excel必须的Jar包 import jxl.Workbook; import jxl.format.Alignment;...import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException;

    jxl.jar包简介/java操作excel

    JXL的优势在于它完全用Java编写,因此在任何支持Java的平台上都能运行,包括Windows和Linux,它对中文字符的支持也非常良好。 JXL的主要功能包括: 1. 创建新的Excel文件:开发者可以使用JXL API来构建全新的Excel...

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

    3. **处理图形和图表**:"jxl.biff.drawing.dg"和"jxl.biff.drawingdg"暗示了JXL库对Excel图表的支持。通过`Drawing`类,你可以读取和修改Excel中的图表,包括类型、数据源、标题、坐标轴等属性。 4. **高级特性**...

    jxl.jar_java操作excel表格的jar包

    import jxl.write.WritableWorkbook; import jxl.write.WriteException; public class ExcelWriter { public static void main(String[] args) { try { WritableWorkbook workbook = Workbook.createWorkbook...

    解决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 ...

    jxl.jar和jxl.api文档及使用方法

    2. **导入库**:在Java代码中,需要导入相关的包,如`jxl.Workbook`、`jxl.write.WritableWorkbook`等。 3. **读取Excel**:使用`Workbook`类的静态方法`Workbook.getWorkbook(File)`来打开一个Excel文件。 4. **...

    jxl.jar包最新jar包亲测可用

    - jxl.jar不支持.xlsx格式(Excel 2007以上版本),仅支持.xls格式。 通过上述内容,我们可以看出jxl.jar包在Java中处理Excel文件的强大功能。无论是简单的数据读取还是复杂的格式设定,jxl.jar都能提供简洁的API...

    jxl.jar excel操作包

    然而,值得注意的是,jxl.jar的主要限制在于它仅支持旧版的Excel文件格式,即.xls文件,而不兼容较新的.xlsx格式。这是由于.xlsx格式是基于Microsoft Office Open XML标准,而jxl.jar的设计并未涵盖这一更新的标准。...

    jxl.jar完整包

    本文将深入探讨如何使用jxl.jar这个完整的Java库来创建Excel文件,并设置字体样式、表格等格式。 首先,我们要理解jxl库的核心功能。jxl库支持读取和写入Excel 97-2003格式的文件(.xls),提供了一个API,允许...

    excel 导出用的jxl.jar

    使用`jxl.write.WritableWorkbook`类,我们可以创建一个新的Excel工作簿对象。这个对象代表了Excel文件,可以包含多个工作表。例如: ```java WritableWorkbook workbook = Workbook.createWorkbook(new File(...

    java的jxl.jar

    import jxl.write.biff.HSSFDataValidationRecord; DataValidationHelper validationHelper = new DataValidationHelper((HSSFWorkbook) workbook); DataValidationConstraint constraint = validationHelper....

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

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

    jxl.jar源码

    源码中,这些功能主要集中在`jxl.read.biff`和`jxl.write.biff`两个包中。BIFF(Binary Interchange File Format)是Excel早期版本的数据存储格式,而OpenXML是微软从2007版开始引入的新格式。 在读取Excel文件时,...

    jxl.jar使用文档

    jxl.jar 通过java操作excel表格的工具类库 支持Excel 95-2000的所有版本 生成Excel 2000标准格式 支持字体、数字、日期操作 能够修饰单元格属性 支持图像和图表 应该说以上功能已经能够大致满足我们的需要。...

    jxl.jar和例子

    标题中的"jxl.jar和例子"表明了这个压缩包包含了一个名为"jxl.jar"的文件和相关的示例。这提示我们,这是一个关于使用Java处理Excel文件的资源包。jxl.jar是Java Excel API(JExcelApi)的一个版本,它是一个开源库...

    jxl.jar没费下载

    4. **图像与图表**:除了基本的数据操作,jxl.jar还支持插入图片到Excel文件中,包括剪贴画和图像文件。对于图表,虽然不能直接创建,但可以通过读取现有的图表,然后在新的Excel文件中复制和修改。 三、使用示例 ...

    jxl.jar包(2.6).zip

    jxl.jar是通过java操作excel表格的工具类库,开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的。

    Java操作Excel(jxl.jar)

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

    jxl.rar_java添加jxl依赖_jxl_jxl.jar

    java实现数据的导入与导出依赖包 jxl.jar

Global site tag (gtag.js) - Google Analytics