通过读取Excel文档批量插入或更新数据库数据, 这种方式在现有软件应用当中已经屡见不鲜了,下面我简单介绍一下使用JExcel开源工具读取excel文档。
一般读取存在两种:其中一种是读取本地文件;另外一种是通过上传的方式直接读取excel内容。
这两种方式大同小异,主要区别在于获取WorkBook调用方法的不同。
第一种:
WorkBook workbook = WorkBook.getWorkbook(java.io.File file);
第二种是在第一种的基础之上直接读取输入流
WorkBook workbook = WorkBook.getWorkbook(java.io.InputStream is);
获取到WorkBook对象后就可以得到sheet对象和Cell对象了。
下面是读取上传文件方式读取的例子,该例子需要commons-fileupload-*.jar和commons-io-*.jar两个包。
<!-- 通用上传组件 -->
<form method="post" enctype="multipart/form-data" action="../test/uploadoperation.jsp">
<table>
<tr>
<td>
请选择需要上传的文档:
</td>
<td>
<input type="file" id="filename" name="filename">
</td>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
response.setContentType("text/html;charset=gbk");
if (!DiskFileUpload.isMultipartContent(request)) {
out.println("只能处理multipart/form-data类型的数据!");
return;
}
DiskFileUpload fu = new DiskFileUpload();
// 最多上传200M数据
fu.setSizeMax(1024 * 1024 * 200);
// 超过1M的字段数据采用临时文件缓存
fu.setSizeThreshold(1024 * 1024);
// 设置上传的普通字段的名称和文件字段的文件名所采用的字符集编码
fu.setHeaderEncoding("gbk");
// 得到所有表单字段对象的集合
List fileItems = null;
try {
fileItems = fu.parseRequest(request);
} catch (FileUploadException e) {
out.println("解析数据时出现如下问题:");
e.printStackTrace();
return;
}
// 如果存在多个文件, 循环读取内容
// 处理每个表单字段
Iterator i = fileItems.iterator();
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (fi.isFormField()) {
String content = fi.getString("UTF-8");
String fieldName = fi.getFieldName();
request.setAttribute(fieldName, content);
} else {
try {
String pathSrc = fi.getName();
/*
* 如果用户没有在FORM表单的文件字段中选择任何文件,那么忽略对该字段项的处理
*/
if (pathSrc.trim().equals("")) {
continue;
}
InputStream is = fi.getInputStream();//得到文件流
Workbook wb = Workbook.getWorkbook(is);//先得到workbook对象
Sheet sheet = wb.getSheet(0);//然后获取该excel对象的工作表对象,sheet对象可存在多个,可通过
//根据实际情况判断是否需要读取第一行的内容
//举例:如果是要把数据导入到数据库, 则可在第一列放置数据库字段名, 可先通过字段名创建表, 然后插入数据
//注意:这里需要注意数组越界的问题
for (int m = 0; m < sheet.getRows(); m++) {
//先读行, 然后读列
Cell[] cells = sheet.getRow(m);
for (int j = 0; j < cells.length; j++)
{
System.out.println(cells[j].getContents());
}
}
} catch (Exception e) {
out.println("存储文件时出现如下问题:");
e.printStackTrace();
return;
} finally { // 总是立即删除保存表单字段内容的临时文件
fi.delete();
}
}
}
一般读取存在两种:其中一种是读取本地文件;另外一种是通过上传的方式直接读取excel内容。
这两种方式大同小异,主要区别在于获取WorkBook调用方法的不同。
第一种:
WorkBook workbook = WorkBook.getWorkbook(java.io.File file);
第二种是在第一种的基础之上直接读取输入流
WorkBook workbook = WorkBook.getWorkbook(java.io.InputStream is);
获取到WorkBook对象后就可以得到sheet对象和Cell对象了。
下面是读取上传文件方式读取的例子,该例子需要commons-fileupload-*.jar和commons-io-*.jar两个包。
<!-- 通用上传组件 -->
<form method="post" enctype="multipart/form-data" action="../test/uploadoperation.jsp">
<table>
<tr>
<td>
请选择需要上传的文档:
</td>
<td>
<input type="file" id="filename" name="filename">
</td>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
response.setContentType("text/html;charset=gbk");
if (!DiskFileUpload.isMultipartContent(request)) {
out.println("只能处理multipart/form-data类型的数据!");
return;
}
DiskFileUpload fu = new DiskFileUpload();
// 最多上传200M数据
fu.setSizeMax(1024 * 1024 * 200);
// 超过1M的字段数据采用临时文件缓存
fu.setSizeThreshold(1024 * 1024);
// 设置上传的普通字段的名称和文件字段的文件名所采用的字符集编码
fu.setHeaderEncoding("gbk");
// 得到所有表单字段对象的集合
List fileItems = null;
try {
fileItems = fu.parseRequest(request);
} catch (FileUploadException e) {
out.println("解析数据时出现如下问题:");
e.printStackTrace();
return;
}
// 如果存在多个文件, 循环读取内容
// 处理每个表单字段
Iterator i = fileItems.iterator();
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (fi.isFormField()) {
String content = fi.getString("UTF-8");
String fieldName = fi.getFieldName();
request.setAttribute(fieldName, content);
} else {
try {
String pathSrc = fi.getName();
/*
* 如果用户没有在FORM表单的文件字段中选择任何文件,那么忽略对该字段项的处理
*/
if (pathSrc.trim().equals("")) {
continue;
}
InputStream is = fi.getInputStream();//得到文件流
Workbook wb = Workbook.getWorkbook(is);//先得到workbook对象
Sheet sheet = wb.getSheet(0);//然后获取该excel对象的工作表对象,sheet对象可存在多个,可通过
//根据实际情况判断是否需要读取第一行的内容
//举例:如果是要把数据导入到数据库, 则可在第一列放置数据库字段名, 可先通过字段名创建表, 然后插入数据
//注意:这里需要注意数组越界的问题
for (int m = 0; m < sheet.getRows(); m++) {
//先读行, 然后读列
Cell[] cells = sheet.getRow(m);
for (int j = 0; j < cells.length; j++)
{
System.out.println(cells[j].getContents());
}
}
} catch (Exception e) {
out.println("存储文件时出现如下问题:");
e.printStackTrace();
return;
} finally { // 总是立即删除保存表单字段内容的临时文件
fi.delete();
}
}
}