- 浏览: 808983 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (307)
- struts (8)
- hibernate (3)
- spring (32)
- opensourceproject (12)
- javaScript (9)
- primeton EOS (2)
- journey of heart (10)
- Design pattern (6)
- ejb (17)
- point (37)
- Linux&Unix (22)
- ibatis (10)
- AJAX (6)
- DB (26)
- Protocol (6)
- chart (4)
- web server (11)
- webservice (7)
- integration (3)
- tuxedo (5)
- ext (4)
- android (1)
- c/c++ (12)
- JVM (1)
- paginationFrame (2)
- code (2)
- report (1)
- High-performance web (1)
- svn (1)
- JQuery (1)
- workDaily (2)
- cloud (16)
- Python (8)
- English (2)
- shell (5)
- googleCode (1)
- nio (1)
- hyper-v (1)
- debug (3)
- vbs (2)
- openstack (3)
- K8S (1)
- Mesos (0)
- Spark (0)
- Marathon (0)
最新评论
-
钱图大展:
chao2751021 写道lib包哪里去下载,找不到
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
钱图大展:
无法下载
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
fm395728572:
shell脚本中用到了环境变量,但是获取不到,例如脚本中有一句 ...
ganymed-ssh2 for Java -
liuhanjiang:
我qq147229234
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
liuhanjiang:
博主 我利用您提供的方法实现博文中介绍的clickstream ...
大型网站用户行为记录的一个实现--基于clickStream(第一部分)
有个需求
1.要把用户从数据库查询到的明细,可以支持一xls方式的导出。
2.用户可以讲xls格式的数据导入到数据库
一开始就想到了使用jxl,先热热身,看看jxl.jar的基本使用方法
package cn.com.xinli.util; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.text.SimpleDateFormat; import java.util.Date; import jxl.Sheet; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.CellFormat; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class TestJXL { public static void main(String[] args) throws Exception { TestJXL.saveToEXcle(); } public static void saveToEXcle() { // 准备设置excel工作表的标题 String[] title = {"编号","产品名称","产品价格","产品数量","生产日期","产地","是否出口"}; try { // 获得开始时间 long start = System.currentTimeMillis(); // 输出的excel的路径 String filePath = "c:\\test.xls"; // 创建Excel工作薄 WritableWorkbook wwb; // 新建立一个jxl文件,即在C盘下生成test.xls OutputStream os = new FileOutputStream(filePath); wwb=Workbook.createWorkbook(os); // 添加第一个工作表并设置第一个Sheet的名字 WritableSheet sheet = wwb.createSheet("产品清单", 0); Label label; for(int i=0;i<title.length;i++){ // Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是y // 在Label对象的子对象中指明单元格的位置和内容 label = new Label(i,0,title[i]); // 将定义好的单元格添加到工作表中 sheet.addCell(label); } // 下面是填充数据 /* * 保存数字到单元格,需要使用jxl.write.Number * 必须使用其完整路径,否则会出现错误 * */ // 填充产品编号 jxl.write.Number number = new jxl.write.Number(0,1,20071001); sheet.addCell(number); // 填充产品名称 label = new Label(1,1,"金鸽瓜子"); sheet.addCell(label); /* * 定义对于显示金额的公共格式 * jxl会自动实现四舍五入 * 例如 2.456会被格式化为2.46,2.454会被格式化为2.45 * */ jxl.write.NumberFormat nf = new jxl.write.NumberFormat("0.00"); //#.## jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(nf); // 填充产品价格 jxl.write.Number nb = new jxl.write.Number(2,1,0.1,wcf); sheet.addCell(nb); // 填充产品数量 jxl.write.Number numb = new jxl.write.Number(3,1,200); sheet.addCell(numb); /* * 定义显示日期的公共格式 * 如:yyyy-MM-dd hh:mm * */ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String newdate = sdf.format(new Date()); // 填充出产日期 label = new Label(4,1,newdate); sheet.addCell(label); // 填充产地 label = new Label(5,1,"陕西西安"); sheet.addCell(label); /* * 显示布尔值 * */ jxl.write.Boolean bool = new jxl.write.Boolean(6,1,true); sheet.addCell(bool); /* * 合并单元格 * 通过writablesheet.mergeCells(int x,int y,int m,int n);来实现的 * 表示将从第x+1列,y+1行到m+1列,n+1行合并 * * */ sheet.mergeCells(0,3,2,3); label = new Label(0,3,"合并了三个单元格"); sheet.addCell(label); /* * * 定义公共字体格式 * 通过获取一个字体的样式来作为模板 * 首先通过web.getSheet(0)获得第一个sheet * 然后取得第一个sheet的第二列,第一行也就是"产品名称"的字体 * */ CellFormat cf = wwb.getSheet(0).getCell(1, 0).getCellFormat(); WritableCellFormat wc = new WritableCellFormat(); // 设置居中 wc.setAlignment(Alignment.CENTRE); // 设置边框线 wc.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置单元格的背景颜色 wc.setBackground(jxl.format.Colour.RED); label = new Label(1,5,"字体",wc); sheet.addCell(label); // 设置字体 jxl.write.WritableFont wfont = new jxl.write.WritableFont(WritableFont.createFont("隶书"),20); WritableCellFormat font = new WritableCellFormat(wfont); label = new Label(2,6,"隶书",font); sheet.addCell(label); /*设置列宽*/ sheet.setColumnView(0,12); sheet.setColumnView(1,10); sheet.setColumnView(2,8); sheet.setColumnView(3,20); sheet.setColumnView(4,8); sheet.setColumnView(5,15); sheet.setColumnView(6,12); sheet.setColumnView(7,15); // 写入数据 wwb.write(); // 关闭文件 wwb.close(); long end = System.currentTimeMillis(); System.out.println("----完成该操作共用的时间是:"+(end-start)/1000); } catch (Exception e) { System.out.println("---出现异常---"); e.printStackTrace(); } } }
下面完成需求1,导出
先决条件:
a.mysql环境+struts
b.建立测试使用的person表
CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=gbk
分析:当用户点击了导出按钮,会弹出一个对话框,打开或者保存,这个是使用
response.setContentType("application/vnd.ms-excel;charset=GBK");//设置输出类型 response.addHeader("Content-Disposition","attachment;filename="+fileName);
然后使用输出流构造 WritableWorkbook 工作薄对象,吧从数据库查到的结果集,一行一行的写到xls中
需求2
要将xls中的数据读取出来,然后插到数据库中,关键是 拿到输入流,根据输入流构造WritableWorkbook 工作薄对象,然后使用
Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 int columnum = sheet.getColumns(); // 得到列数 int rownum = sheet.getRows(); // 得到行数
得到行数和列数,写个双循环,拿到单元格里面的内容,构造sql语句,然后将它们插入到数据库中,关于根据单元格的内容批量执行sql,这里有一个效率问题,网上看到一个blog,受益很大(MYSQL)
对于大数据量的插入,建议使用insert into tableName (x,xx,xxx) values(x,xx,xxx),(xx,xxx,xxxx)…,的方式
这样只执行一个sql 就将数据插入到数据库中了,使用循环 来insert,或者使用 pstmt.addBatch()的放似乎都没有这样效率高,效率在这样写sql效率比 循环 来insert,或者使用 pstmt.addBatch() 能提高10倍左右的时间,不过sql的长度是有限制的,我们可以自己设置每1000条记录提交一次来解决
下面贴一下Action中的关键代码
package cn.com.xinli.action.user; import java.io.DataInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jxl.Sheet; import jxl.Workbook; import jxl.format.Alignment; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import cn.com.xinli.action.BaseAction; import cn.com.xinli.bean.User; import cn.com.xinli.util.DBUtil; public class ExcleOperateAction extends BaseAction { Logger log=Logger.getLogger(ExcleOperateAction.class); @Override public ActionForward doIt(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String operType = request.getParameter("operType"); log.info("operType:"+operType); if (operType != null) { if (operType.equals("upload")) { return upload(mapping, form, request, response); } else if(operType.equals("download")) { return download(mapping, form, request, response); } } return null; } private ActionForward download(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { log.info("开始执行导出文件操作"); String fileName = new String("记录明细".getBytes("GB2312"), "ISO_8859_1"); response.setContentType("application/vnd.ms-excel;charset=GBK");//设置输出类型 response.addHeader("Content-Disposition","attachment;filename="+fileName); try { // 创建Excel工作薄 WritableWorkbook wwb; wwb = Workbook.createWorkbook(response.getOutputStream()); WritableCellFormat wc = new WritableCellFormat(); /*居中*/ wc.setAlignment(Alignment.CENTRE); // 添加第一个工作表并设置第一个Sheet的名字 WritableSheet sheet = wwb.createSheet("网银明细", 0); String[] title = { "ID", "Name"}; Label label; for (int i = 0; i < title.length; i++) { // Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是z // 在Label对象的子对象中指明单元格的位置和内容 label = new Label(i, 0, title[i],wc); // 将定义好的单元格添加到工作表中 sheet.addCell(label); } List<User> list=new ArrayList<User>(); Connection conn=null; ResultSet rs=null; PreparedStatement pstmt; conn=DBUtil.getConnection(); String sql="select * from person"; pstmt=conn.prepareStatement(sql.toString()); rs =pstmt.executeQuery(); while(rs.next()) { User user=new User(); user.setId(rs.getString("id")); user.setName(rs.getString("name")); list.add(user); } if(list.size()>0) { int cols=0; int rows=1; for(User user : list) { Label label1=new Label(cols++,rows,user.getId(),wc); Label label2=new Label(cols++,rows,user.getName(),wc); sheet.addCell(label1); sheet.addCell(label2); rows++; cols=0; } /*设置列宽*/ sheet.setColumnView(0,12); sheet.setColumnView(1,10); } wwb.write(); // 关闭文件 wwb.close(); } catch(Exception e) { e.printStackTrace(); } return null; } private ActionForward upload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { log.info("开始执行导入文件操作"); try { /*读取文件流*/ DataInputStream in = new DataInputStream(request.getInputStream()); /*过滤HTTPHeader,否则jxl会报无法识别文件结尾的错误*/ for(int i = 0; i < 4; i++) { in.readLine(); } Workbook book = Workbook.getWorkbook(in); Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 int columnum = sheet.getColumns(); // 得到列数 int rownum = sheet.getRows(); // 得到行数 System.out.println("列数:"+columnum); System.out.println("行数 :"+rownum); Connection conn=null; PreparedStatement pstmt; conn=DBUtil.getConnection(); StringBuffer sql = new StringBuffer("INSERT INTO person (id,name) values "); for ( int i =0; i < rownum; i ++) // 循环进行读写,这里从1开始是不读取第一行 { if(i!=0) { sql.append(","); } sql.append("("); for ( int j = 0 ; j < columnum; j ++ ) { String c=sheet.getCell(j, i).getContents(); // 得到第j列第i行的单元格的内容 System.out.println("("+j+","+i+"):"+c); sql.append("'"+c+"'"); if(j<columnum-1) { sql.append(","); } } sql.append(")"); } pstmt=conn.prepareStatement(sql.toString()); pstmt.execute(); request.setAttribute("message", "上传文件成功.."); return mapping.findForward("result"); } catch(Exception e) { request.setAttribute("message", "上传文件失败.."+e.getMessage()); return mapping.findForward("result"); } } }
关于附件:
1.下载附件直接可以导入到eclipse
2.mysql+person 表 可以直接 使这个web项目跑起来
参考资料:
http://www.blogjava.net/hankchen/archive/2009/09/01/293430.html
http://www.pcstu.com/databases/MSsql/jq/20080929/63477.html
http://fuhao9611.iteye.com/blog/72485
- jxl.rar (6.7 MB)
- 下载次数: 64
发表评论
-
eclipse link 方式管理插件
2012-02-24 15:55 1536以配置tomcat插件为例: (条件:F:\eclip ... -
使用mapinfo 开发GIS 应用
2011-03-18 06:56 12851. mapJ 对象是在tomcat启动的时候 从web ... -
java mail adapter
2011-01-21 12:23 15242011.04.27: 使用jmail 发送中文标题的 ... -
4种调用https服务的方式
2011-01-05 23:45 8771以前在网厅的时候,请求计费的账单开 ... -
正则表达式30分钟入门教程
2010-11-17 12:58 1466正则表达式30分钟入门教程 -
java 异常层次
2010-05-26 16:14 1327Java 中的异常类,包括内置的异常类以及自定义的异常类,都直 ... -
java 解惑你知多少 (转载)
2010-04-26 12:43 1191(1) http://jiangzhengjun.it ... -
jvm调优
2010-04-16 15:35 1274(1) http://pengjiaheng.itey ... -
谈谈重构
2010-04-15 13:34 1302代码重构阅读心得[转] http://www.cnblogs ... -
session会话跟踪的一个小例子
2010-03-14 18:16 1855内容包括: 必备知识: ... -
cookie机制和session机制的区别
2010-03-14 17:06 1187一、cookie机制和sessio ... -
Cookie详解
2010-03-14 16:02 1391Cookie在英文中是小甜品 ... -
什么是Cookie?
2010-03-14 15:06 1442按照Netscape官方文档中 ... -
任务、进程和线程的区别(转)
2010-02-04 17:16 2270任务(task)是最抽象 ... -
加密,解密,认证,数字签名,公钥私钥
2010-01-13 20:42 2316Bob,Alice和数字证书 网络安全中最知名的 ... -
JNI
2009-12-26 14:09 1571JNI是Java Native Inter ... -
JSON在处理hibernate中的cascade对象时的解决方案
2009-12-24 22:12 1518如果数据间存在级联关系,在hibernate中极容易嵌套而 ... -
digester框架 将 XML->JavaBean
2009-11-08 17:38 1742digester组件简化了xml文 ... -
什么是P问题、NP问题和NPC问题
2009-10-25 20:20 2040什么是P问题、NP问题和NPC问题 出自mat ... -
用Fat Jar Eclipse Plug-In打包可执行jar文件
2009-09-30 08:29 3953Fat Jar Eclipse Plug-In [FJEP] ...
相关推荐
本篇将详细介绍如何利用`jxl`库来操作Excel文件,并结合实例说明如何从Excel文件中提取数据并生成TXT文件。 首先,我们需要理解`jxl`库的基本结构。`jxl`库主要提供了`Workbook`、`Sheet`、`Cell`等类,分别对应...
### jxl操作Excel文件知识点详解 #### 一、jxl简介 jxl 是一款用于 Java 环境下的 Excel 操作库,由一位韩国开发者所编写。与 Apache POI 相比,jxl 的功能略显简单,但在中文支持方面表现出色。jxl API 不依赖于...
标题“jxl操作excel文件例子”指的是利用JXL库进行Excel文件处理的实际应用。描述中提到的“通过jxl操作excel,简单方便”,暗示了JXL库的一个关键优点——简洁易用的API,使得对Excel文件的操作变得相当直观。 JXL...
在Java编程环境中,处理Excel数据是一项常见的任务,而`jxl`库是一个广泛使用的开源库,专门用于读取和写入Microsoft Excel文件。本篇将详细介绍如何使用`jxl`库进行Excel的操作,包括导入、导出、读取以及更新Excel...
本篇文章将深入探讨JXL库在操作Excel和数据库导出Excel文件方面的应用。 首先,我们来了解JXL的基本用法。JXL支持读取和写入Biff8格式的Excel文件(即97-2003版本的.XLS文件),这涵盖了大部分常见的Excel文件需求...
JXL 操作 EXCEL 的各个类的解析是 Java 语言中操作 Excel 文件的主要方法之一。JXL 通过提供了多种类来实现对 Excel 文件的读写操作。 首先,JXL 提供了一个抽象类 Workbook,该类相当于是一个工具类,用于生成 ...
### 使用JXL库下载并处理Excel文件 #### 知识点概述 本文将详细介绍如何使用JXL库结合Java网络编程技术来实现从指定URL下载Excel文件,并将其保存到本地指定目录的功能。此外,我们还将简单介绍如何使用JXL库读取...
以上就是Java使用JXL库操作Excel的基本知识。通过这些方法,你可以创建复杂的Excel文件,处理大量的数据,并实现自定义的格式和样式。在实际项目中,JXL是一个强大且灵活的工具,能够满足各种Excel相关的编程需求。
3. **解析保存**:使用JXL库读取并解析Excel文件。以下是一个简单的示例代码片段,展示如何打开文件并遍历工作表: ```java Workbook workbook = Workbook.getWorkbook(new File("path_to_your_excel_file")); ...
`jxl`库是一个广泛使用的第三方库,它允许开发者轻松地读取、写入和修改Excel文件。本篇文章将深入探讨如何利用`jxl.jar`包来实现这一功能。 首先,确保你已经正确地将`jxl.jar`文件添加到你的项目类路径中。这可以...
`jxl`库允许开发者使用Java语言来读写Microsoft Excel文件,无需依赖于Excel应用程序本身。本文将详细介绍如何使用`jxl`库进行Excel操作,并提供一个简单的实例。 首先,`jxl.jar`是`jxl`库的主要组件,你需要将其...
JXL操作Excel设置字体颜色设置单元格详解 JXL是一个韩国人写的Java操作Excel的工具,在开源...使用JXL操作Excel设置字体颜色设置单元格可以通过使用jxl.write.Label对象和jxl.write.WritableSheet对象的相关方法实现。
Java使用JXL库生成Excel文件是一项常见的任务,特别是在数据处理、报表生成或导出时。JXL是一个开源的Java库,允许我们...JXL提供了广泛的API来处理各种复杂的Excel操作,是Java环境下生成Excel文件的一个实用工具。
本项目中的“公司真正项目使用jxl操作excel代码程序”是一个具体的实例,展示了如何利用Java的jxl库来与Excel文件进行交互,以满足公司报表打印的需求。 jxl是一个开源的Java库,它允许开发人员读取、写入和修改...
jxl对下拉列表的读写操作以及相应的修改功能
在这种场景下,一个常用的库是jxl,它允许开发者在Java环境中创建、读取和修改Excel文件。本文将详细探讨如何在Android应用中使用jxl库快速导出Excel表格。 首先,我们需要理解jxl库的基本概念。jxl是一个Java API...
标题"关于jxl操作excel说明以及jxl.jar包下载2.6"表明我们将探讨如何使用JXL库以及在哪里获取它的特定版本(2.6)。 首先,让我们深入了解一下JXL库。JXL是Java Excel API的简称,它提供了一套完整的API,可以创建...
这个"jxl操作excel Demo"显然是一份示例代码,它展示了如何使用jxl库来与Excel文件进行交互。以下是对jxl库和其在处理Excel文件中使用方法的详细说明。 1. **jxl库介绍** jxl是一个开源的Java库,允许开发者在Java...