关于 javaWeb 开发中利用 Jfree 控件从 excel 将数据导入并
保存到数据库中的操作和注意事项
在 JavaWeb 开发 MIS 系统很多的时候都需要将数据一条条
的填入到相应的控件中并获取值来进行数据库中的数据的
插入,这样的界面是少不了的但是我们与此同时也是很希望
能够进行数据的批处理,比如批量数据的导入和批量数据的
导入。
在这里我先描述一下我们想实现的功能:
将规定格式的 excel 文件比如:
编号 药名
DR0008 板蓝根颗粒
规格
20 袋*10 克 四川蜀中制药有限公司
生产商
批文
国药准字 H20020120
DR0009 云南白药气雾剂 85g+30g
云南白药集团股份有限公
司
国药准字 Z53021103
现在要将这样格式的数据保存在数据库中。
基本的思路:
我们在数据库中首先是建立一张相应的表然后我们将数据读取出
来一条条的执行便可,这样就基本的可以实现将数据保存在
数据库中了
方法:利用 jxl.jar 这个包将相应的 excel 文件上传到服务器 Tomcat
服务器(我用的是 tomcat 服务器)然后再获取服务器上该
文件的地址将数据解析出来分别插入到数据库中这样便完
成了要做的工作
步骤:(1)新建一个 web 工程(我的开发工具是 MyEclipse 8.5
1
Tomcat5.X MySql
Excel2003)
(2)将所需要的 jxl.jar 包导入到需要存放的地方(包自己下载 网
上到处都是)
(3)建 excel 文件上传到服务器(我将部分代码粘贴出来 仅供参
考)
String fileUrl = "";
DiskFileItemFactory dfif = new
DiskFileItemFactory();
ServletFileUpload sfu = new
ServletFileUpload(dfif);
try {
// 开始解析解析的结果的是一个FileItem的
集合
// 每一个FileItem代表表单中的一个域
List items =
sfu.parseRequest(request);
for (int i = 0; i < items.size(); i++)
{
FileItem item = (FileItem)
items.get(i);
if (item.isFormField()) {
String fieldName =
2
item.getFieldName();
String value =
item.getString();
} else {
// 文件名, 对于某些操作系统,返回的
// 文件名包含了路径。
// d:\\dir1\t1.jpg
String filename1 =
item.getName();
String filename =
filename1.substring(filename1
.indexOf("\\") + 1);
该是
// 选择一个存放文件的目录,该目录应
// 服务器上的某个目录
// getRealPath("upload"):获得服
务器上的某个目录的
// 绝对路径。
String path1 =
getServletContext()
.getRealPath("upload");
3
// 将解析之后的文件存放到某个目录
item.write(new File(path1 + "/"
fileUrl = path1 + "/" + filename;
下。
+ filename));
}
}
} catch (Exception e) {
throw new
ServletException(e.getMessage());
}
上面你也许需要建立一个服务器中装载上传文件的文件,注意路径
的问题
(4)建服务器上面的刚刚上传的目标文件的路径获取到并加载到
这里来
这个地方我用一个工具类:
package util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
4
import java.util.List;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
public class ImportExcel {
public List>
getContent(String fileUrl) {
InputStream is = null;
List> sheetList = new
ArrayList>();
// 获得要导入的文件
Workbook wk = null;
try {
is = new FileInputStream(fileUrl);
wk = Workbook.getWorkbook(is);
// 加载到工作薄中
Sheet sheet = wk.getSheet(0);
// 获取工作薄中的指定的工作表
int columns = sheet.getColumns();
5
// 获取工作表的列数
int rows = sheet.getRows();
// 获取工作表的行数
List colNames = new
ArrayList();
// 这个是表头 将这个表头装到集合中去
for (int j = 0; j < columns; j++) {
Cell cell = sheet.getCell(j, 0);
colNames.add(cell.getContents());
}
sheetList.add(colNames);// 表中已经装
入了上面的表头
for (int i = 1; i < rows; i++) {
// 这里由于上面将第一行的表头已经装在带工
作表中了所以从第二行开始
boolean flag = false;
// 设置一个标志位 如果表中没有元素这就是
false 如果有则改为true
List rowContent = new ArrayList();
// 每一行创建一个集合 放到sheetList中去
for (int j = 0; j < colNames.size();
j++) {
6
Cell cell = sheet.getCell(j, i);//
前面是列后面是行
rowContent.add(cell.getContents());
if (cell.getContents() != null
&& !"".equals(cell.getContents())) {
flag = true;
}
}
if (flag) {
sheetList.add(rowContent);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (wk != null) {
wk.close();
}
try {
is.close();
7
} catch (IOException e) {
e.printStackTrace();
}
}
return sheetList;
}
}
下面我 new 了一个对象来用上面那个工具类
ImportExcel importExcel = new ImportExcel();
List> sheetList =
importExcel.getContent(fileUrl);
//这里面的fileUrl是上面声明的全局变量
//也就是获取的服务器中的上传的目标文件的地址
TDruginfoDAO dao = (TDruginfoDAO)
DAOFactory
.getInstance(TDruginfoBaseDAO.class);
for (int i = 1; i < sheetList.size();
i++) {
// 获取每一行的内容new List
List
sheetList.get(i);
rowContents
=
8