sparta-紫杉 2010-9-28 9:32
JXL官网(http://jexcelapi.sourceforge.net/)
POI官网(http://poi.apache.org/)
注: 目前JXL暂不能支持Excel2007格式。 但POI是可以的。
一、环境
jxl.jar(2.4.2), eclipse3.4.2, jdk1.4.2, oracle9.2.0.1, weblogic8.12。
jxl为开源项目,在对Excle操作时比较方便。
二、背景
在系统项目中,是使用Jxl来读Excle,以完成从Excle的内容导入到系统数据库的功能。
但在“成本管理 - 维修费导入”功能中, 用户需要下载相关的“示例文件”。 “示例文件”中为了实现用户的“选择录入”
(即通过Excel的 数据-有效性-序列 实现用户下拉选择相关的内容进行输入),提前预置了两列基础数据,分别为
“维修费类别名称”和“服务商名称”, 这两列数据在数据库中是不断更新的, 而这种更新需要及时反映到该“示例文件”的Excel中,
就是说, 数据库中的数据和示例文件中的数据是相同的,才能使用户可以选择录入完整的数据。
基于上述需要,需要对Jxl对Excel的读、写及更新操作进行研究。
三、 Jxl读Excel的完整代码
public static void main(String[] args){
String filePath = "c:/维修费示例数据格式表.xls";
try {
Workbook wb = Workbook.getWorkbook( new File( filePath ) );
int sheetCount = wb.getNumberOfSheets();
//逐个sheet表读数据
for ( int i = 0; i < sheetCount; i++){
Sheet sheet = wb.getSheet(i);
if( null != sheet ){
//逐行逐列读取数据
int cols = sheet.getColumns();
int rows = sheet.getRows();
for(int j = 0; j < cols; j++){
for( int k = 0; k < rows; k++){
//显示各行列数据
System.out.println( sheet.getCell( j, k ).getContents() );
}
}
}
}
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
四、Jxl更新Excel的完整代码
这里的更新,指的是对已有的Excel文件的某个Sheet表中的某个或某些单元格进行更新(前提是这些单元格里面已经有数据了)。
更新Excle,吐血推荐需要重点注意的两点:
1、在对单元格进行setString之后,要进行Write(),否则不会写入(具体表现为被操作的Excle文件提示“文件格式不对”无法打开,文件遭损坏)。
2、是在Excel中的单元格不能为空(是已经有数据了), 若为空,则会提示数据类型不对异常无法更新。
不过,可以通过在需要更新的单元格中预置一个或多个空格就可以了(Jxl默认对存在的空格视为Lable),可以允许更新。
代码如下:
/** *//**
* 与{@link #SynchronizationUpdate()}相配套,
* 以完成"服务商名称"在"示例文件"中与数据库的同步更新。
*
* @param filePath
* 示例文件Excel的完整路径。
*
*@author sparta 2010-9-26
*
*@return void
*/
public void UpdateServiceProviders( String filePath ){
CmResultSet rs = null;
//定义存放"服务商"名称的变量
ArrayList ServicesList = new ArrayList();
// 提取"服务商"的名称并排序
String sql = "select distinct qymc from htgl_fwsgl_fwsjbxx " +
"where (fwdwid,xh) in " +
"(select fwdwid,max(xh) from htgl_fwsgl_fwsjbxx " +
"where (whfwdwstate=0 or whfwdwstate=4) " +
"group by fwdwid) order by qymc";
try {
ConnectDB connectDB = new ConnectDB();
rs = connectDB.getRs(sql, null);
// 提取"服务商"名称并暂放到List中,以备更新到Excel中。
while (rs.next()) {
ServicesList.add(rs.getString(0));
}
} catch (Exception ex) {
ex.printStackTrace();
logger.error("::::::::::::数据库连接失效,维修费导入-同步更新'示例文件'的"
+ "'服务商名称'失败!");
return;
}
try {
Workbook wb = Workbook.getWorkbook(new File(filePath));
File targetFile = new File(filePath);
WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
WritableSheet sheet = wwb.getSheet("DB");
if (null != sheet) {
for (int i = 0; i < ServicesList.size(); i++) {
WritableCell cell = sheet.getWritableCell( 3, i );
//单元格中若为空,则不允许更新
if ( cell.getType() == CellType.LABEL ) {
Label l = (Label) cell;
l.setString( ServicesList.get(i).toString() );
}
}
}
// 更新到Excel(必须)。
wwb.write();
// 在使用后释放文件流。
wwb.close();
wb.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("::::::::::::写入Excel出现错误,维修费导入-同步更新"
+ "'示例文件'的'服务商名称'失败!");
}
}
五、Jxl写Excle的完整代码
这里的写,指的是建立Sheet,或增加单元格,完全是在一个新的文件、或新的Sheet、或新的单元格中操作。
public static void main(String[] args){
String filePath = "c:/维修费示例数据格式表.xls";
try {
//建立工作薄
WritableWorkbook wb = Workbook.createWorkbook( new File( filePath ) );
//建立sheet表
WritableSheet sheet = wb.createSheet("DB2", 2);
//增加单元格并写入数据
try {
sheet.addCell( new Label(0, 1, "书目ID") );
sheet.addCell( new Label(1, 1, "ISBN") );
sheet.addCell( new Label(2, 1, "定价") );
sheet.addCell( new Label(3, 1, "书名") );
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
//写入工作簿
wb.write();
//关闭工作薄
try {
wb.close();
} catch (WriteException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
哈哈,就这么多了,涵盖了Jxl读、写、更新Excle2003的相关代码,希望看到的人能够获得一点启示,就会心满意足。
-东营 sparta-紫杉 原创,转载请注明出处 :)
http://www.blogjava.net/SpartaYew/
SpartaYew@163.com
QQ:22086526