分享
 
 
 

Java操作excel

王朝学院·作者佚名  2010-01-01
窄屏简体版  字體: |||超大  

最近公司要求把excel的数据导入到数据库中去。当时没怎么想就直接用java.sql包下的类把数据读出来然后拼装成sql语句,顺利完成了任务。后来用第三方插件实现了读,写,修改excel文件。 现在拿出来就和大家分享。希望能够在某种程度上帮大家解决一些实际问题。

第三方组件可以在此下载:http://nexcel.sourceforge.net/

首先我们先用Jdbc-Odbc桥连接excel文件:

先配置好数据源(我的操作系统是Windows 7英文版,可能和大家的不一样):管理工具(Administrative Tools)->数据源(Data Source ODBC)->添加(Add),选择 Microsoft do Driver Excel->完成(Finish)->填写数据源名(Data Source Name)->选择工作薄(Select Workbook)找到你的excel文件就可以了。这里不多说了,大家可以查找相关资料。下面是我的测试代码:

public static void readXLSByJdbcOdbc() {

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

try {

//这里使用JdbcOdbc桥

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

//new为数据源名

conn = DriverManager.getConnection("jdbc:odbc:test");

//表明要用[$]括起来,data对应的是excel中sheet名

ps = conn.prepareStatement("select * from [Person$]");

rs = ps.executeQuery();

while(rs.next()) {

System.out.println(rs.getLong("uid") + "\t" + rs.getString("用户名") + "\t" + rs.getString("pwd"));

}

rs.close();

ps.close();

conn.close();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}

}

说明一下,用这种方式只能读取excel中的数据,而且不字段的数据类型不易控制。

下面是运用第三方组件读写修改excel文件的测试代码,在此我就不详述了,代码中都有注释很容易理解:

package com.westdream.test;

import java.io.File;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import jxl.CellType;

import jxl.Sheet;

import jxl.Workbook;

import jxl.read.biff.BiffException;

import jxl.write.Label;

import jxl.write.WritableCell;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

import jxl.write.WriteException;

import jxl.write.biff.RowsExceededException;

public class JavaAndExcel {

public JavaAndExcel() {

}

/**

*@author WESTDREAM

*/

public static void main(String[] args) {

updateXLSUsingJXL();

}

//读取excel文件中的数据

public static void readXLSByJXL() {

try {

//读取已有excel文件

Workbook workbook = Workbook.getWorkbook(new File("D:\\test.xls"));

//得到名为Person的sheet

Sheet sheet = workbook.getSheet("Person");

//循环输出excel中的数据

for(int row = 0; row < 3; row++) {

for(int col = 0; col < 3; col++) {

System.out.print(sheet.getCell(col, row).getContents() + "\t");

}

System.out.println();

}

} catch (BiffException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//将数据写入excel文件

public static void writeXLSUsingJXL() {

WritableWorkbook workBook = null;

try {

//创建workbook对象

workBook = Workbook.createWorkbook(new File("E:\\student.xls"));

//创建一个名为Student的sheet

WritableSheet sheet = workBook.createSheet("Student", 0);

//给sheet添加一系列的cell,注意cell的坐标是从(0,0)开始的,其代表着excel中第一行,第一列的方格

//这里主要是在sheet中加入一行字段

sheet.addCell(new Label(0,0, "student_id"));

sheet.addCell(new Label(0,1, "student_name"));

sheet.addCell(new Label(0,2,"student_age"));

//下面添加两行数据

sheet.addCell(new Label(1,0, "0000001"));

sheet.addCell(new Label(1,1, "张三"));

sheet.addCell(new Label(1,2, "20"));

sheet.addCell(new Label(2,0, "0000002"));

sheet.addCell(new Label(2,1, "李四"));

sheet.addCell(new Label(2,2, "21"));

workBook.write();

workBook.close();

System.out.println("文件写入成功");

} catch (IOException e) {

e.printStackTrace();

} catch (RowsExceededException e) {

e.printStackTrace();

} catch (WriteException e) {

e.printStackTrace();

}

}

//修改excel文件

public static void updateXLSUsingJXL() {

Workbook workBook = null;

WritableWorkbook copy = null;

WritableSheet sheet = null;

try {

System.out.println("开始修改文件...");

//得到workbook

workBook = Workbook.getWorkbook(new File("E:\\student.xls"));

//复制workbook并保存到student_copy.xls

copy = Workbook.createWorkbook(new File("E:\\student_copy.xls"), workBook);

//得到Student

sheet = copy.getSheet("Student");

//拿到指定的cell(这里是第2行,第2列的数据)

WritableCell cell = sheet.getWritableCell(1, 1);

//修改数据

if (cell.getType() == CellType.LABEL) {

Label l = (Label) cell;

l.setString("王五");

}

copy.write();

copy.close();

System.out.println("文件修改成功,并已保存至student_copy.xls");

} catch (BiffException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (WriteException e) {

e.printStackTrace();

}

}

}

总结一下,如果用JDBC-ODBC桥的话只能读取excel文件中的数据,而且其数据类型也不太好控制,jxl 作为第三组件比较容易上手,而且功能强大。能够对excel文件进行读写修改等操作。如果大家仔细观察其编码过程有点像awt编程,而实质上jxl也只是对文件流操作的封装。建议大家先学好j2se基础知识。顺便提一下,java jdbc还可以操作txt文件,这里我不举例了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kings988/archive/2009/12/29/5099589.aspx

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有