Java操作excel
2009-12-30 21:14:40 来源:WEB开发网核心提示:最近公司要求把Excel的数据导入到数据库中去,当时没怎么想就直接用java.sql包下的类把数据读出来然后拼装成sql语句,Java操作excel,顺利完成了任务,后来用第三方插件实现了读,java jdbc还可以操作txt文件,这里我不举例了,写,修改excel文件
最近公司要求把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
第三方组件可以在此下载: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
更多精彩
赞助商链接