∙
利用java如何读取Excel中的数据!
新一篇: Oracle优化方针!
利用java读取Excel中的数据!
使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事。在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet 中创建一个CSV (comma separated values)文件,并将这个文件以MIME,text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到Excel文件,但是还不能真正的操纵Excel文件,本文将给大家一个惊喜,向大家介绍一个开放源码项目,Java Excel API,使用它大家就可以方便地操纵Excel文件了。
JAVA EXCEL API简介
Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。
Java Excel API 文档
www.andykhan/jexcelapi/
www.andykhan/jexcelapi/
1.应用示例:
如何从Excel读取数据:
如何从Excel读取数据:
package allen;
import java.io.*;
import java.util.*;
import util.StringUtil;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
/** *//**
* <p>Title: </p>
* <pre>Description: Excel数据导入到oracle数据库类.
* </pre>
import java.io.*;
import java.util.*;
import util.StringUtil;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
/** *//**
* <p>Title: </p>
* <pre>Description: Excel数据导入到oracle数据库类.
* </pre>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: 易通技术有限公司</p>
* @author Allen
* @version 1.0
*/
public class ExcelImportOracle ...{
/** *//**
* 用于返回三维数组的ArrayList.
*/
private static ArrayList subdata = new ArrayList();
/** *//**
* Excel中的表名.
*/
* <p>Company: 易通技术有限公司</p>
* @author Allen
* @version 1.0
*/
public class ExcelImportOracle ...{
/** *//**
* 用于返回三维数组的ArrayList.
*/
private static ArrayList subdata = new ArrayList();
/** *//**
* Excel中的表名.
*/
private static String tablename;
/** *//**
* 文件的路径
*/
private static String filePath;
/** *//**
* 该方法为完成读取Excel中的数据并将数据插入到对应的数据库表中的操作(在调用前需要先调用setFilePath(String)这个方法.).
* @author Administrator
* @param data:读取Excel中的数据的数组.
* @deprecated:将读取Excel中的数据插入到对应的数据库表中. *
*/
public static void ExcelDataImportOracle(String filePath) throws Exception ...{
/** *//**
* 文件的路径
*/
private static String filePath;
/** *//**
* 该方法为完成读取Excel中的数据并将数据插入到对应的数据库表中的操作(在调用前需要先调用setFilePath(String)这个方法.).
* @author Administrator
* @param data:读取Excel中的数据的数组.
* @deprecated:将读取Excel中的数据插入到对应的数据库表中. *
*/
public static void ExcelDataImportOracle(String filePath) throws Exception ...{
try ...{
ArrayList al = readExcel(filePath);
InsertData(al);
} catch (Exception e) ...{
e.printStackTrace();
}
}
/** *//**
* 读取Excel中的数据.将这些数据放入到一个三维数组中.
* @author Administrator
* @param filePath 文件路径.
* @deprecated:读取Excel中的数据将它放入到ArrayList数组中(此为三维数组).
*/
public static ArrayList readExcel(String filePath) ...{
ArrayList al = readExcel(filePath);
InsertData(al);
} catch (Exception e) ...{
e.printStackTrace();
}
}
/** *//**
* 读取Excel中的数据.将这些数据放入到一个三维数组中.
* @author Administrator
* @param filePath 文件路径.
* @deprecated:读取Excel中的数据将它放入到ArrayList数组中(此为三维数组).
*/
public static ArrayList readExcel(String filePath) ...{
try ...{
subdata.clear();//将静态ArrayList数组清空.(如果不清空原数据会不断累加)
InputStream is = new FileInputStream(filePath);
Workbook rwb =&Workbook(is);
// Sheet st =&Sheet(0);//这里有两种方法获取sheet表,1为名字,而为下标,从0开始
// Sheet st =&Sheet("Book1");// Excel中第一页的页名称.
Sheet st[] =&Sheets();// 得到所有Excel中页的列表.
for (int a = 0; a < st.length; a++) ...{
ArrayList alList = new ArrayList();
ArrayList tablenames = new ArrayList();
ArrayList tableAndContents = new ArrayList();
tablename = st[a].getName().trim();
int b = 0;
for (int i = 1; i < st[a].getRows(); i++) ...{
subdata.clear();//将静态ArrayList数组清空.(如果不清空原数据会不断累加)
InputStream is = new FileInputStream(filePath);
Workbook rwb =&Workbook(is);
// Sheet st =&Sheet(0);//这里有两种方法获取sheet表,1为名字,而为下标,从0开始
// Sheet st =&Sheet("Book1");// Excel中第一页的页名称.
Sheet st[] =&Sheets();// 得到所有Excel中页的列表.
for (int a = 0; a < st.length; a++) ...{
ArrayList alList = new ArrayList();
ArrayList tablenames = new ArrayList();
ArrayList tableAndContents = new ArrayList();
tablename = st[a].getName().trim();
int b = 0;
for (int i = 1; i < st[a].getRows(); i++) ...{
ArrayList al = new ArrayList();
for (int j = 0; j < st[a].getColumns(); j++) ...{
Cell c00 = st[a].getCell(j, i);
// 通用的获取cell值的方式,返回字符串
String strc00 =&Contents().trim());
// 获得cell具体类型值的方式得到内容.
al.add(j, strc00);
}
alList.add(b, al);
b++;
}
tablenames.add(tablename);
tableAndContents.add(0, tablenames);
tableAndContents.add(1, alList);
subdata.add(a, tableAndContents);
for (int j = 0; j < st[a].getColumns(); j++) ...{
Cell c00 = st[a].getCell(j, i);
// 通用的获取cell值的方式,返回字符串
String strc00 =&Contents().trim());
// 获得cell具体类型值的方式得到内容.
al.add(j, strc00);
}
alList.add(b, al);
b++;
}
tablenames.add(tablename);
tableAndContents.add(0, tablenames);
tableAndContents.add(1, alList);
subdata.add(a, tableAndContents);
}
rwb.close();
// 关闭
//System.out.println(subdata);// 输出
} catch (Exception e) ...{
e.printStackTrace();
}
finally
...{
//删除上传文件
File file = new File(filePath);
boolean result = false;
if(ists())
...{
rwb.close();
// 关闭
//System.out.println(subdata);// 输出
} catch (Exception e) ...{
e.printStackTrace();
}
finally
...{
//删除上传文件
File file = new File(filePath);
boolean result = false;
if(ists())
...{
result = file.delete();
}
else
...{
System.out.println("文件没有到,无法删除!");
}
if(result)
...{
System.out.println("删除成功!");
}
else
...{
System.out.println("删除失败!");
}
}
else
...{
System.out.println("文件没有到,无法删除!");
}
if(result)
...{
System.out.println("删除成功!");
}
else
...{
System.out.println("删除失败!");
}
}
return subdata;
}
/** *//**
* 将读取的Excel的三维数组数据进行对应的数据库表插入操作.
* @author Administrator
* @param data:读取Excel中的数据的数组.
* @deprecated:将读取Excel中的数据插入到对应的数据库表中.
*/
private static void InsertData(ArrayList data) ...{
try ...{
String tablename;
ArrayList Contents = new ArrayList();
for (int i=0; i<data.size(); i++)...{
return subdata;
}
/** *//**
* 将读取的Excel的三维数组数据进行对应的数据库表插入操作.
* @author Administrator
* @param data:读取Excel中的数据的数组.
* @deprecated:将读取Excel中的数据插入到对应的数据库表中.
*/
private static void InsertData(ArrayList data) ...{
try ...{
String tablename;
ArrayList Contents = new ArrayList();
for (int i=0; i<data.size(); i++)...{
tablename = ((ArrayList)(((i)).get(0)).get(0).toString();
Contents = (ArrayList)(((i)).get(1);
WfdefineDateOperate.currecorde(tablename,Contents);
}
} catch (Exception e) ...{
e.printStackTrace();
}
}
/** *//**
* 得到文件路径;
* @return filePath
*/
public String getFilePath() ...{
return filePath;
Contents = (ArrayList)(((i)).get(1);
WfdefineDateOperate.currecorde(tablename,Contents);
}
} catch (Exception e) ...{
e.printStackTrace();
}
}
/** *//**
* 得到文件路径;
* @return filePath
*/
public String getFilePath() ...{
return filePath;
}
/** *//**
* 设置文件路径的位置;
* @param filePath
*/
public void setFilePath(String filePath) ...{
ExcelImportOracle.filePath = filePath;
}
/** *//**
* 将readExcel方法读出来的三维数组数据转换成二维数组数据.
* @param al
* @return 返回二维数组数据.
*/
public static ArrayList getDisplayData(ArrayList al)
/** *//**
* 设置文件路径的位置;
* @param filePath
*/
public void setFilePath(String filePath) ...{
ExcelImportOracle.filePath = filePath;
}
/** *//**
* 将readExcel方法读出来的三维数组数据转换成二维数组数据.
* @param al
* @return 返回二维数组数据.
*/
public static ArrayList getDisplayData(ArrayList al)
...{
ArrayList result = new ArrayList();
for(int i = 0;i < al.size();i ++)
...{
ArrayList tmp = (ArrayList)(((i)).get(1);
for(int j = 0;j < tmp.size();j ++)
...{
result.(j));
}
}
return result;
}
ArrayList result = new ArrayList();
for(int i = 0;i < al.size();i ++)
...{
ArrayList tmp = (ArrayList)(((i)).get(1);
for(int j = 0;j < tmp.size();j ++)
...{
result.(j));
}
}
return result;
}
/** *//**
* @param args
*/
public static void main(String[] args) ...{
}
}
* @param args
*/
public static void main(String[] args) ...{
}
}
发表于 @ 2006年07月21日 10:20:00|评论( )|编辑
旧一篇: 关于Excel中的数据如何导入到oracle数据库中.
评论
#xuewei2007 发表于2008-02-18 14:43:42 IP: 168.160.249.*
您好!
新年快乐java怎么编写!
看了你的这篇文章后,自己也尝试着操作,可是没有成功.请问可不可以留下联系,便于请问.
MSN :xuewei2007@msn
新年快乐java怎么编写!
看了你的这篇文章后,自己也尝试着操作,可是没有成功.请问可不可以留下联系,便于请问.
MSN :xuewei2007@msn
2008-02-19 08:46:15作者回复
我现在很少上MSN,不过blog我经常来,我的MSN:apicescn@hotmail
#xuewei2007 发表于2008-02-18 14:50:07 IP: 168.160.249.*
想问你下,就是在那个InsertData方法
for (int i=0; i<data.size(); i++)...{
tablename = ((ArrayList)(((i)).get(0)).get(0).toString();
Contents = (ArrayList)(((i)).get(1);
WfdefineDateOperate.currecorde(tablename,Contents);
}
WfdefineDateOperate这个是怎么用的,它有什么作用呢?等待您的解答.
for (int i=0; i<data.size(); i++)...{
tablename = ((ArrayList)(((i)).get(0)).get(0).toString();
Contents = (ArrayList)(((i)).get(1);
WfdefineDateOperate.currecorde(tablename,Contents);
}
WfdefineDateOperate这个是怎么用的,它有什么作用呢?等待您的解答.
2008-02-19 08:45:20作者回复
此类的currecorde方法的作用就是将Contents数据持久化到tablename表中。我写的是静态方法直接调用即可!
#xuewei2007 发表于2008-02-19 13:39:59 IP: 168.160.249.*
其实我已经想到了你这个应该是起的这么个作用的,
如果方便的话,可以将你的那个WfdefineDateOperate类,也就是你数据持久化的这个过程给我看看吗?
如果方便的话,可以将你的那个WfdefineDateOperate类,也就是你数据持久化的这个过程给我看看吗?
2008-02-20 09:27:49作者回复
此类涉及数据持久化底层操作,内容较多,请见谅!
#xuewei2007 发表于2008-02-19 13:45:26 IP: 168.160.249.*
还有我还有其他的问题,就是我发现,好象在读取数据的时候,始终是从第二行数据开始读的,不知道你碰到这个问题没?
另外你这里的getDisplayData()这个方法,好象没用上?
2008-02-20 09:24:44作者回复
getDisplayData()方法是提供其他地方所用,此方法是返回Excel的数据内容,而不进行持久化操作,可用于WEB层显示数据所用。<br /><br />另外关于你讲的从第二行读数据是由于for (int i = 1; i < st[a].getRows(); i++) 此处i=1的原因,你修改成0就行了,因为一般情况下第一行为标题,固而不需读,当然这得成一种规则约定才行。
#xuewei2007 发表于2008-02-20 09:56:29 IP: 168.160.249.*
哦,谢谢啊!
我自己现在是将数据一行行的读出来(一条记录),然后把它封装成一个JAVABEAN对象,然后传到我的持久层进行操作的.
谢谢啊,又学了点东西.
我自己现在是将数据一行行的读出来(一条记录),然后把它封装成一个JAVABEAN对象,然后传到我的持久层进行操作的.
谢谢啊,又学了点东西.
#xuewei2007 发表于2008-02-20 16:52:24 IP: 168.160.249.*
我想问下,你的数据到底层,持久层时,你操作的一个基本思想,可以透露吗?
2008-02-21 09:03:02作者回复
思想其实很简单,就是将Excel中读取的数据存入到tablename中去,关于如何写:就是读取一行一行的数据,然后进行插入到tablename表中,循环完成所有的数据即可了!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论