乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > 如何用<em>java</em>导入excel数据到数据库-java excel库,java处理

如何用<em>java</em>导入excel数据到数据库-java excel库,java处理

作者:乔山办公网日期:

返回目录:excel表格制作


1、利用Excel第三方工具,将Excel文件读取到内存中。使用最简单,方便的工具是apache的poi工具包,自己网上下载 http://poi.apache.org/ ,使用方法网上一搜一大片。

2、如果是对于特别大的excel(大于20M的话),简单的读取方法就容易内存溢出了,需要采用流式读取的方式,参考http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api 

3、将已读入内存的Excel数据,整理成写数据库的数据结构,然后插入数据库。这部分工作应该不用介绍了,就是基本的数据库操作方法,与excel无关了



//从excle文档中,将值导入至list数组
//xlsPath 路径 从前台获取
//Excle导入
public List<TblUser> loadScoreInfo(String xlsPath) throws IOException{
    List temp = new ArrayList();
FileInputStream fileIn = new FileInputStream(xlsPath);
//根据指定的文件输入流导入Excel从而产生Workbook对象
Workbook wb0 = new HSSFWorkbook(fileIn);
//获取Excel文档中的第一个表单
Sheet sht0 = wb0.getSheetAt(0);
//对Sheet中的每一行进行迭代
        for (Row r : sht0) {
        //如果当前行的行号(从0开始)未达到2(第三行)则从新循环
if(r.getRowNum()<1){
continue;
}
//创建实体类
TblUser info=new TblUser();
//取出当前行第1个单元格数据,并封装在info实体stuName属性上
if(r.getCell(0)!=null){
 r.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
     info.setId(Integer.parseInt(r.getCell(0).getStringCellValue()));
}
//同上
if(r.getCell(1)!=null){
     r.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
     info.setUsername(r.getCell(1).getStringCellValue());
}
if(r.getCell(2)!=null){
     r.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
     info.setPassword(r.getCell(2).getStringCellValue());
e799bee5baa6e79fa5e98193e59b9ee7ad94339}
if(r.getCell(3)!=null){
     r.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
     info.setState(r.getCell(3).getStringCellValue());
}
if(r.getCell(4)!=null){
     r.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
     info.setRename(r.getCell(4).getStringCellValue());
}
if(r.getCell(5)!=null){
     r.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
     info.setEmail(r.getCell(5).getStringCellValue());
}
 temp.add(info);
        }
        fileIn.close();    
        return temp;    
    }

 public void ztree()
 {
 
 }
//导出当前页的数据
public void exportPage(){
List<TblUser> list=new ArrayList<TblUser>();
String[] slist=daor.split(",");
//将页面获取到的id集合遍历,循环添加到list中,进行本页数据到导出
for (int i = 0; i < slist.length; i++) {
list.add(tus.findById(java.lang.Integer.parseInt(slist[i])));
}
tus.export(list);
}

/**
 * 导入Excle到数据库
 * @return null 不然有可能报错!
 * @throws IOException
 */

public void importExcle() throws IOException{
//调用导入文件方法并存入数组中
int s=0;//得到成功插入的条数
int i=0;//得到共有多少条
/**
 * 将不符合格式的数据错误信息存入数组中!
 * 格式要求:
 * 用户名,密码不能为空!
 * 用户名不能和已存在的用户名重复,长度在5-18位之间
 * 密码长度在6-18位之间
 */
String errors="";//保存导入失败信息
try {
System.out.println("进入方法!");

lists=this.loadScoreInfo(path);
System.out.println(path);
for (TblUser u : lists) {
i++;
if(u.getUsername()==""){
    errors+="第"+i+"条数据的用户名为空,导入失败!";//^^:分割符
    continue;
}
if(u.getPassword()==""){
errors+="第"+i+"条数据的密码为空,导入失败!";//^^:分割符
continue;
}
if(tus.findByName(u.getUsername())){
errors+="第"+i+"条数据的用户名 已存在,导入失败!";//^^:分割符
continue;
}
if(u.getUsername().length()<5 || u.getUsername().length()>20){
errors+="第"+i+"条数据的用户名格式错误,导入失败!";//^^:分割符
continue;
}
if(u.getPassword().length()<6 || u.getPassword().length()>20){
errors+="第"+i+"条数据的密码格式错误,导入失败!";//^^:分割符
continue;
}
s++;
tus.save(u);//将数组中的数据添加到数据库中!
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println("错误:"+errors);
}

        
}  

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.sql.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import jxl.*;
public class SimUpdate {
private String fileName;
public ZfzSimUpdate(String fileName){
this.fileName = fileName;
}
static Map tNames;
static{
tNames = new HashMap();
}
/**
* 用于产生 数据库的 ID 值,组成 [年月日时分秒(100-999)] 总共 17 位数.
* 根据不同的表名,可保证同一秒内产生的 ID 号不重复
*/
private static String getDtime() {
String rid;
Date nd = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
rid = sdf.format(nd);
return rid;
}

public String getSeqNumber(String tableName) {
if(tableName == null || "".equals(tableName))
tableName = "GENERY";
Integer it;
// noinspection SynchronizeOnNonFinalField
synchronized(tNames){
it = (Integer)tNames.get(tableName);
if(it == null){
it = new Integer(100);
tNames.put(tableName, it);
}else{
if(it.intValue() > 998)
it = new Integer(100);
else
it = new Integer(1 + it.intValue());
tNames.put(tableName, it);
}
}
return getDtime() + String.valueOf(it);
}

private void updateDb(){
try{
Connection conn = DbPool.connectDB();
if(conn != null){
Statement stmt = conn.createStatement();
jxl.Workbook rwb = null;

try{
//构建Workbook对象 只读Workbook对象
//直接从本地文件创建Workbook
//从输入流创建Workbook
InputStream is = new FileInputStream(fileName);
rwb = Workbook.getWorkbook(is);
//Sheet(术语:工作表)就是Excel表格左下角的Sheet1,Sheet2,Sheet3但在程序中
//Sheet的下标是从0开始的
//获取第一张Sheet表
Sheet rs = rwb.getSheet(0);
//获取Sheet表中所包含的总列数
int rsColumns = rs.getColumns();
//获取Sheet表中所包含的总行数
int rsRows = rs.getRows();
//获取指这下单元格的对象引用

String simNumber = "",termSeqId = "";
//指定SIM卡号及序列号
for(int i=0;i<rsRows;i++){
for(int j=0;j<rsColumns;j++){
Cell cell = rs.getCell(j,i);
if(j==0){
simNumber = cell.getContents();
}
termSeqId = "633"+simNumber;
}
String sql = "查询SQL";
int isOk = stmt.executeUpdate(sql);
if(isOk == 0 && !simNumber.equals("")){
String termId = getSeqNumber("termInf");
String insertSql = "自定义INSERT";
int isAdd = stmt.executeUpdate(insertSql);
if(isAdd > 0){
System.out.println("成功插入第"+i+"条数据");
}

}
//System.out.println("SIM卡号:"+simNumber+",序列号:"+termSeqId);
}

//以下代码为写入新的EXCEL,这里不使用,所以注释
/*

//利用已经创建的Excel工作薄创建新的可7a64e58685e5aeb9335写入的Excel工作薄
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File("D://Book2.xls"),rwb);
//读取第一张工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);

//获取第一个单元格对象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
//决断单元格的类型,做出相应的转化
if (wc.getType() == CellType.LABEL) {
Label l = (Label) wc;
l.setString("The value has been modified.");
}
//写入Excel对象
wwb.write();
wwb.close();
*/
}catch(Exception e){
e.printStackTrace();
}
finally{
//操作完成时,关闭对象,翻译占用的内存空间
rwb.close();

}
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
DbPool dbPool = new DbPool("dbConn.cfg");//连接数据库
SimUpdate simUpdate = new SimUpdate("zfz_sim.xls");
simUpdate.updateDb();

}

}

public static void main(String args[]) throws BiffException, IOException, WriteException{
//1 从Excel文件读取数据表

//Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。
//读取Excel数据表的第一步是创建Workbook(术语:工作薄),下面的代码片段举例说明了应该如何操作:
//(完整代码见ExcelReading.java)

try
{
//构建Workbook对象, 只读Workbook对象
//直接从本地文件创建Workbook
//从输入流创建Workbook
InputStream is = new FileInputStream("D:/user.xls");
jxl.Workbook rwb = Workbook.getWorkbook(is);

//一旦创建了Workbook,我们就可以通过它来访问Excel Sheet(术语:工作表)。参考下面的代码片段:

//获取第一张Sheet表
Sheet rs = (Sheet) rwb.getSheet(0);
//我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,
//要注意的一点是下标从0开始,就像数组一样。

//一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。参考下面的代码片段:

//获取第一行,第一列的值
Cell c00 = ((jxl.Sheet) rs).getCell(0, 0);
String strc00 = c00.getContents();

//获取第一行,第二列的值
Cell c10 = ((jxl.Sheet) rs).getCell(1, 0);
String strc10 = c10.getContents();

//获取第二行,第二列的值
Cell c11 = ((jxl.Sheet) rs).getCell(1, 1);
String strc11 = c11.getContents();

System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());

//如果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,
//它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell(0, 0)是文本型,
//Cell(1, 0)是数字型,Cell(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。

//如果有需要知道Cell内容的确切类型,API也提供了一系列的方e68a84e8a2ad7a686964616f366法。参考下面的代码片段:

String strcc00 = null;
double strcc10 = 0.00;
Date strcc11 = null;

Cell cc00 = ((jxl.Sheet) rs).getCell(0, 0);
Cell cc10 = ((jxl.Sheet) rs).getCell(1, 0);
Cell cc11 = ((jxl.Sheet) rs).getCell(1, 1);

if(c00.getType() == CellType.LABEL)
{
LabelCell labelc00 = (LabelCell)cc00;
strcc00 = labelc00.getString();
}
if(c10.getType() == CellType.NUMBER)
{
NumberCell numc10 = (NumberCell)cc10;
strcc10 = numc10.getValue();
}
if(c11.getType() == CellType.DATE)
{
DateCell datec11 = (DateCell)cc11;
strcc11 = datec11.getDate();
}

System.out.println("Cell(0, 0)" + " value : " + strcc00 + "; type : " + cc00.getType());
System.out.println("Cell(1, 0)" + " value : " + strcc10 + "; type : " + cc10.getType());
System.out.println("Cell(1, 1)" + " value : " + strcc11 + "; type : " + cc11.getType());

//在得到Cell对象后,通过getType()方法可以获得该单元格的类型,然后与API提供的基本类型相匹配,
//强制转换成相应的类型,最后调用相应的取值方法getXXX(),就可以得到确定类型的值。
//API提供了以下基本类型,与Excel的数据格式相对应,如下图所示:

//每种类型的具体意义,请参见Java Excel API Document。

//当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,
//以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。参考如下代码片段:

//操作完成时,关闭对象,释放占用的内存空间
rwb.close();

}
catch (Exception e)
{
e.printStackTrace();
}

//Java Excel API提供了许多访问Excel数据表的方法,在这里我只简要地介绍几个常用的方法,
//其它的方法请参考附录中的Java Excel API Document。

//Workbook类提供的方法

//1. int getNumberOfSheets();
//获得工作薄(Workbook)中工作表(Sheet)的个数,示例:

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
int sheets = rwb.getNumberOfSheets();

//2. Sheet[] getSheets();
//返回工作薄(Workbook)中工作表(Sheet)对象数组,示例:

jxl.Workbook rwb2 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
Sheet[] sheets2 = (Sheet[]) rwb2.getSheets();

//3. String getVersion();
//返回正在使用的API的版本号,好像是没什么太大的作用。

jxl.Workbook rwb3 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
String apiVersion = rwb3.getVersion();

//Sheet接口提供的方法

//1) String getName();
//获取Sheet的名称,示例:

jxl.Workbook rwb4 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
jxl.Sheet rs = rwb4.getSheet(0);
String sheetName = rs.getName();

//2) int getColumns()
//获取Sheet表中所包含的总列数,示例:

jxl.Workbook rwb5 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
jxl.Sheet rs2 = rwb5.getSheet(0);
int rsColumns = rs2.getColumns();

//3) Cell[] getColumn(int column)
//获取某一列的所有单元格,返回的是单元格对象数组,示例:

jxl.Workbook rwb6 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
jxl.Sheet rs3 = rwb6.getSheet(0);
Cell[] cell = rs3.getColumn(0);

//4) int getRows()
//获取Sheet表中所包含的总行数,示例:

jxl.Workbook rwb7 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
jxl.Sheet rs4 = rwb7.getSheet(0);
int rsRows = rs4.getRows();

//5) Cell[] getRow(int row)
//获取某一行的所有单元格,返回的是单元格对象数组,示例子:

jxl.Workbook rwb8 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
jxl.Sheet rs5 = rwb8.getSheet(0);
Cell[] cell5 = rs5.getRow(0);

//6) Cell getCell(int column, int row)
//获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,
//这与通常的行、列组合有些不同。

jxl.Workbook rwb9 = jxl.Workbook.getWorkbook(new File("D:/user.xls"));
jxl.Sheet rs6 = rwb9.getSheet(0);
Cell cell6 = rs6.getCell(0, 0);

相关阅读

关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网