所用Jar包
1. sqljdbc4.jar
连接数据库的Jar包(根据数据库的不同进行选择,我用的SqlServer2008)
2.Jxl.jar
访问Excel的Jar包
注意:支持以.xls结尾的Excel文件,可能不支持.xlsx结尾的
Excel数据:
完整代码:
package xsl;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class Test {
public static void main(String[] args) {
//1. java读取Excel文档内容
String filePath = "C:/Users/0223000320/Desktop/student.xls";
InputStream is = null;
Workbook rwb = null;
try {
is = new FileInputStream(filePath);//定义文本输入流
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
rwb = Workbook.getWorkbook(is);//打开Workbook
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//获取Excel表的Sheet1区域的数据
Sheet sht = rwb.getSheet("Sheet1"); //或者rwb.getSheet(0)获取第一个区域
int col = sht.getColumns(); //获得Excel列
int row = sht.getRows(); //获得Excel行
//定义一维数组,存放Excel表里的每一行的各个列的数据
Object[] obj = null;
//定义List集合,存放每一行的数据
ArrayList<Object[]> list = new ArrayList<Object[]>();
Cell c1 = null;
try {
//2. 连接数据库的几行代码
Connection con = null;
PreparedStatement ps = null;
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=test;";
String sql = "INSERT INTO student(id, name, age) VALUES (?, ?, ?)";
con = DriverManager.getConnection(url, "sa", "Rfid123456");
con.setAutoCommit(true); //设置自动提交,默认也是TRUE,可不写
ps = con.prepareStatement(sql);// SQL预处理
//3. 读取Excel文档每个单元格的值
//先将数据按行装入一个一维数组Object[]中, 然后将数组逐个加入到ArrayList
for(int i=0; i < row; i++){
obj = new Object[col];
for(int j =0 ;j <col; j++){
c1 = sht.getCell(j,i);
//add
String contents = c1.getContents();
System.out.println(contents);
obj[j] = c1.getContents();
}
System.out.println("------------");
list.add(obj);
}
//4. 再从list获取每条记录,插入数据库
obj = new Object[3];
for(int k = 0; k < row; k++){
obj = list.get(k);
ps.setString(1, obj[0].toString());
ps.setString(2, obj[1].toString());
ps.setString(3, obj[2].toString());
ps.addBatch();
}
ps.executeBatch(); //批量执行
ps.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
数据库插入情况:
控制台打印:
2
aa
23
------------
3
bb
54
------------
4
qq
45
------------
简单来说,核心代码就是以下几行:
InputStream is = fileList.get(0).getInputStream(); Workbook rwb = Workbook.getWorkbook(is); Sheet st = rwb.getSheet(0); Map<String, String> map = new HashMap<String, String>(); int Rows = sheet.getRows(); for (int i = 1; i < Rows; i++) { int id = sheet.getCell(0, i).getContents();//获取第1行第i列 String name = sheet.getCell(1, i).getContents().trim();//获取第2行第i列 int age = sheet.getCell(2, i).getContents();//获取第3行第i列 map.put(id , name + "&" + age); } return map;
list和map根据情况选择,上面的几行代码是简单说明,并不是完整代码,根据需要做处理
动态获取Excel表头指定字符串所在列:
for(int i = 0 ; i < sheet.getColumns(); i++){ String str = sheet.getCell(i, 0).getContents(); if(str.equals("id")){ System.out.println("id:" + i); } if(str.equals("name")){ System.out.println("name:" + i); } if(str.equals("deleted")){ System.out.println("deleted:" + i); } }
适用于:多个文档的表头都有id、name、deleted,但是所在列不同