因为我的项目是JavaWeb的,所有是通过浏览器导入数据库到服务器端的数据库,这里我们采用struts来帮助我们完成。
1:首先定义一个文件上传的jsp页面。把我们的数据先上传到服务器端。
<form action="excelUpload.action" method="post" enctype="multipart/form-data">
Your excel file: <input type="file" name="file">
<input type="submit" value="开始导入">
</form>
2:在struts.xml配置我们的action喽。
<package name="excel" extends="struts-default">
<action name="excelUpload" class="action.ExcelUpload">
<result name="success" type="redirect">/excelUploadSuccess.jsp</result>
<result name="input">/excelUpload.jsp</result>
</action>
</package>
3:当然是书写我们的action了。
package action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import model.Person;
import org.apache.struts2.ServletActionContext;
import service.PersonService;
import service.impl.PersonServiceImpl;
import com.opensymphony.xwork2.ActionSupport;
//将excel导入到数据库,对于日期类型的有问题,只要在excel中要求日期的类型为2012-12-12就可以了,一定不能是2012/12/12
public class ExcelUpload extends ActionSupport {
private File file;
private String fileFileName;
private String fileContentType;//后面3个成员变量的命名是有规律的,不能随便起名字
private String root;
public String getRoot() {
return root;
}
public void setRoot(String root) {
this.root = root;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception {
uploadExcel2PC(); //上传excel文件到服务器的电脑上
String[][] str = getDataFromExcel();//读取excel文件,并且把数据读到一个二维数组里面去。
//printData(str); //打印一下数据。测试用
writeData2DB(str);//把数据写到数据库。
return SUCCESS;
}
private void printData(String[][] str) {
for (int j = 0; j < str.length; j++) {
for (int i = 0; i < str[1].length; i++) {
System.out.print(str[j][i] + " ");
}
System.out.println();
}
}
private void uploadExcel2PC() throws FileNotFoundException, IOException {
root=ServletActionContext.getRequest().getRealPath("/upload");
new File(root).mkdirs();
InputStream is=new FileInputStream(file);
//目标文件,存到目录里面
File destFile=new File(root,fileFileName);
OutputStream os=new FileOutputStream(destFile);
byte[] buffer=new byte[400];
int length=0;
while(-1!=(length=is.read(buffer))){
os.write(buffer,0,length);
}
is.close();
os.close();
}
public String[][] getDataFromExcel() throws BiffException, IOException{
File file = new File(root + "/" + fileFileName);
Workbook book = Workbook.getWorkbook(file); //读取excel文件
Sheet sheet = book.getSheet(0); //这里是获取第一个工作表格
int rows = sheet.getRows(); //获取总的行数
int cols = sheet.getColumns(); //获取总的列数
String[][] str = new String[rows][cols]; //定义一个二维数组
for(int i=0;i<str.length;i++){ //读取单元格内容并存放到二维数组中 默认从第一行第一列读取
for(int j=0;j<str[i].length;j++){
Cell cell = sheet.getCell(j,i);
str[i][j] = cell.getContents();
}
}
if (file.exists()) {
file.delete();
}
return str;
}
private void writeData2DB(String[][] str) {
for (int j = 1; j < str.length; j++) { //从第二行开始读取
Person person=new Person();
person.setUsername(str[j][1]);
person.setPassword(str[j][2]);
person.setAge(Integer.parseInt(str[j][3]));
person.setRegisterDate(StringToDate(str[j][4]));
PersonService personService=new PersonServiceImpl();
personService.savePerson(person);
}
}
public java.sql.Date StringToDate(String dateStr){
DateFormat dd=new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date=null;
try {
date = dd.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
java.sql.Date date2 = new java.sql.Date(date.getTime()); //java.util.date --->java.sql.date
return date2;
}
}
4:大功告成。当然在这里我没有写保存数据到数据库的代码。这不是这个帖子的重点。相信大家都会。