- 在公司做Demo的时候需要对表格数据进行导出,那么首先就考虑主流的POI框架对数据进行导入导出。
一.Apache POI简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
二.POI结构
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。
三.参考Demo
结合项目要求,需要对数据导出到Excel表格,所以在项目中使用到是HSSF的POI,首先是数据的导出,需要用的Jar在文章后面给出,也可以自己到Apache的大本营下载POI的jar包:http://poi.apache.org/,本文中使用到的POI版本是poi-3.9-20121203.jar
- 首先我们需要在页面中提供出一个导出按钮,代码如下
<input type="button" value="导出" class="x-button" onclick="exportout();">
- 我们在JS代码中指定导出按钮所执行的事件
function exportout() {
var tablecmp = Ext.getCmp("jtable");
var arr = tablecmp.getAllTitle();// 获取表格所有的标题,为Excel的表格的表头做准备
var title = new Array(arr.length - 2);// 规定表格默认第一行为序号(递增的序号),最后一行为操作,所以不需要传到表格作为表头
title[0] = "ID";// 设置表格的表头第一列默认为ID值(数据库的主键ID)
for (i = 1; i < title.length; i++) {
title[i] = arr[i + 1];// 动态设置表头
}
window.location.href = "/Demo/servlet/Export?title=" + title;
}
注意:js代码中的数组传入Servlet后字符与字符之间是以”,”进行分割
- Servlet中所处理事件代码
package com.servlet;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.model.C_RES_R_TEST;
import com.tools.DbTools;
import com.tools.ExportExcel;
public class ExportServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("octets/stream");
response.addHeader("Content-Disposition","attachment;filena me=export.xls");
String title = request.getParameter("title") + ",";//获取表格的表头标题,加一个,是为了防止丢失最后一个没有,结尾的字符串
String[] headers = null;
if (title != null && !"".equals(title.trim())) {//按,对字符串进行分割
headers = title.split(",");
}
ExportExcel<C_RES_R_TEST> ex = new ExportExcel<C_RES_R_TEST>();
List<C_RES_R_TEST> dataset = new ArrayList<C_RES_R_TEST>();
dataset = DbTools.getAllObject();
OutputStream out = response.getOutputStream();
ex.exportExcel(headers, dataset, out);
out.close();
System.out.println("excel导出成功!");
}
}
注意:如果使用Servlet需要在web.xml文件中对Servlet进行注册,或者使用@WebServlet(“/servlet/Export “) 注释对Servlet进行配置注册,但是需要注意只有Servlet3.0以上的版本才支持注解配置(Tomcat6.0使用的Servlet2.5版本,Tomcat7.0使用的Servlet3.0版本,你也可以找到Tomcat的安装目录下/common/lib的servlet-api.jar(各版本所在路径不一样),解压找到MANIFEST.MF文件打开后找到Specification-Version: 2.4,那么2.4则为当前的Servlet的版本)。下面给出我的web.xml配置中的代码
<servlet>
<servlet-name>Export</servlet-name>
<servlet-class>com.servlet.ExportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Export</servlet-name>
<url-pattern>/servlet/Export</url-pattern>
</servlet-mapping>
- 导出通用类ExportExcel的源码
package com.tools;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
/**
* 利用开源组件POI动态导出EXCEL文档 应用泛型,代表任意一个符合javabean风格的类
* 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() byte[]表jpg格式的图片数据
*/
public class ExportExcel<T> {
public void exportExcel(Collection<T> dataset, OutputStream out) {
exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy/MM/dd HH:mm:ss");
}
public void exportExcel(String[] headers, Collection<T> dataset,
OutputStream out) {
exportExcel("测试POI导出EXCEL文档", headers, dataset, out,
"yyyy/MM/dd HH:mm:ss");
}
public void exportExcel(String[] headers, Collection<T> dataset,
OutputStream out, String pattern) {
exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
}
/**
* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
*
* @param title
* 表格标题名
* @param headers
* 表格属性列名数组
* @param dataset
* 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
* javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern
* 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
*/
@SuppressWarnings("unchecked")
public void exportExcel(String title, String[] headers,
Collection<T> dataset, OutputStream out, String pattern) {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(15);
// 生成一个格式化工具
HSSFDataFormat format = workbook.createDataFormat();
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setColor(HSSFColor.VIOLET.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
style2.setFont(font2);
// 声明一个画图的顶级管理器
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
0, 0, 0, (short) 4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor("lqs");
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 遍历集合数据,产生数据行
Iterator<T> it = dataset.iterator();
int index = 0;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t = (T) it.next();
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
@SuppressWarnings("rawtypes")
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
// 判断值的类型后进行强制类型转换
String textValue = null;
if (value instanceof Integer) {//Integer
int intValue = (Integer) value;
cell.setCellValue(intValue);
} else if (value instanceof Float) {//Float
float fValue = (Float)value;
style2.setDataFormat(format.getFormat("0.00")); // 两位小数
cell.setCellValue(fValue);
} else if (value instanceof Double) {//Double
double dValue = (Double)value;
style2.setDataFormat(format.getFormat("0.00"));
cell.setCellValue(dValue);
} else if (value instanceof Long) {//Long
long longValue = (Long) value;
cell.setCellValue(longValue);
} else if (value instanceof Boolean) {//如果数据是Boolean那转化为男和女
boolean bValue = (Boolean) value;
textValue = "男";
if (!bValue) {
textValue = "女";
}
} else if (value instanceof Date) {
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
textValue = sdf.format(date);
} else if (value instanceof byte[]) {//字节类型默认为存储图片
// 有图片时,设置行高为60px;
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(i, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[]) value;
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
1023, 255, (short) 6, index, (short) 6, index);
anchor.setAnchorType(2);
patriarch.createPicture(anchor, workbook.addPicture(
bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
} else {
// 其它数据类型都当作字符串简单处理
textValue = value.toString();
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null) {
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
// 其它数据类型都当作字符串简单处理
HSSFRichTextString richString = new HSSFRichTextString(
textValue);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
cell.setCellStyle(style2);//设置一个单元格的样式
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} finally {
// 清理资源
}
}
}
try {
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 导入操作使用异步提交方式,讲文件导入,页面中使用JS代码进行回调
当面临导入的操作的时候我的思路是有俩种,一是使用Form组件中的方法进行提交处理,然后JS中执行回调函数。二是使用Ajax进行提交处理,然后也是同样的对处理后的结果进行处理。当我写了一大堆的代码后发现,我写的JAVA类根本就没有办法获取到我页面上传的表单文件,才发现我们所有封装好的JavaJS的提交方式都是使用Ajax都是无法获取这个文件流的。然后思路转向了使用传统的方式对表单上传的文件进行提交,但是问题还是出现了,就是说我上传的文件上传完成后,系统应该给出相应的信息给前端的页面,是上传失败呢,还是上传成功呢。然而传统的Servlet又无法动态的对JavaJs框架的方法进行调用。最后还是放弃了对传统提交方式的解决方案。
那么问题还是回到最初的问题就是需要异步进行提交,然后无刷新的执行回调函数,那么传统的Ajax提交是没有办法做到的,通过查找资料发现Jquery-form.js提供了这种方式进行异步提交并且可以回调函数,那么我果断采用了这种方式,话不多说上代码: - 页面表单
<form action="/Demo/servlet/ImportServlet" id="fileForm" name="fileForm" enctype="multipart/form-data" method="post">
<input type="file" id="filename" name="filename" class="x-text" />
<input type="button" value="导入Excel" class="x-button" onclick="importEmp()"/>
</form>
- 页面Js代码
//Excel文件导入到数据库中
function importEmp() {
// 检验导入的文件是否为Excel文件
var filename = document.getElementById("filename").value;
if (filename == null || filename == '') {
javajs.warnmsg("请选择要上传的Excel文件");
return false;
} else {
var filename = filename.substring(filename.lastIndexOf('.'))
.toLowerCase();
if (filename == '.xls') {
var form = $("form[name=fileForm]");
var options = {
url : '/Demo/servlet/ImportServlet',
type : 'post',
success : function(reqobj) {
var jsondata = eval("("+reqobj+")");
if (jsondata.result) {
parent.Ext.getCmp("import").close();
parent.javajs.successmsg(jsondata.msg);
var jtable = parent.Ext.getCmp("jtable");
jtable.updateModel();
} else {
javajs.errormsg(jsondata.msg);
}
}
};
form.ajaxSubmit(options);
// $("#fileForm").submit();
} else {
javajs.warnmsg("文件格式需为'.xls'格式");
return false;
}
}
}
- Servlet代码
package com.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.model.C_RES_R_TEST;
import com.newland.javajs.JsonReturn;
import com.tools.DbTools;
public class ImportServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) {
doPost(request, response);
}
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response) {
InputStream fis = null;
PrintWriter out = null;
List<C_RES_R_TEST> infos = new ArrayList<C_RES_R_TEST>();
C_RES_R_TEST cresrtest = null;
DiskFileItemFactory diskFactory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(diskFactory);
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
try {
out = response.getWriter();
boolean flag = true;
List<FileItem> fileItems = upload.parseRequest(request);//得到表单文件对象
Iterator<FileItem> iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
fis = item.getInputStream();
}
// 创建Excel工作薄
HSSFWorkbook hwb = new HSSFWorkbook(fis);
// 得到第一个工作表
HSSFSheet sheet = hwb.getSheetAt(0);
HSSFRow row = null;
// 日期格式化
DateFormat ft = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// 遍历该表格中所有的工作表,i表示工作表的数量 getNumberOfSheets表示工作表的总数
for (int i = 0; i < hwb.getNumberOfSheets(); i++) {
sheet = hwb.getSheetAt(i);
// 遍历该行所有的行,j表示行数 getPhysicalNumberOfRows行的总数
for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) {
row = sheet.getRow(j);
if (row.getPhysicalNumberOfCells() != 7) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的列数不匹配,请重新上传!"));
flag = false;
break;
} else {
if (j == 0) {
if (!"ID".equals(getCellValue(row.getCell(0)))) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第一列不的值不是ID,请重新上传!"));
flag = false;
break;
} else if (!"名称".equals(getCellValue(row.getCell(1)))) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第二列不的值不是名称,请重新上传!"));
flag = false;
break;
} else if (!"地市".equals(getCellValue(row.getCell(2)))) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第三列不的值不是地市,请重新上传!"));
flag = false;
break;
} else if (!"县区".equals(getCellValue(row.getCell(3)))) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第四列不的值不是县区,请重新上传!"));
flag = false;
break;
} else if (!"时间".equals(getCellValue(row.getCell(4)))) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第五列不的值不是时间,请重新上传!"));
flag = false;
break;
} else if (!"经度".equals(getCellValue(row.getCell(5)))) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第六列不的值不是经度,请重新上传!"));
flag = false;
break;
} else if (!"纬度".equals(getCellValue(row.getCell(6)))) {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第七列不的值不是纬度,请重新上传!"));
flag = false;
break;
}
} else {
cresrtest = new C_RES_R_TEST();
if (getCellValue(row.getCell(0)) != null && !"".equals(getCellValue(row.getCell(0)))) {
cresrtest.setSysIntId((new Long((long)row.getCell(0).getNumericCellValue())).intValue());//ID类型转化比较复杂
} else {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的ID值为空,请重试!"));
flag = false;
break;
}
if (getCellValue(row.getCell(1)) != null && !"".equals(getCellValue(row.getCell(1)))) {
cresrtest.setLocationName(getCellValue(row.getCell(1)));
} else {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的名称值为空,请重试!"));
flag = false;
break;
}
if (getCellValue(row.getCell(2)) != null && !"".equals(getCellValue(row.getCell(2)))) {
cresrtest.setCity(getCellValue(row.getCell(2)));
} else {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的地市值为空,请重试!"));
flag = false;
break;
}
if (getCellValue(row.getCell(3)) != null && !"".equals(getCellValue(row.getCell(3)))) {
cresrtest.setCounty(getCellValue(row.getCell(3)));
} else {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的县区值为空,请重试!"));
flag = false;
break;
}
if (getCellValue(row.getCell(4)) != null && !"".equals(getCellValue(row.getCell(4)))) {
cresrtest.setTime(ft.parse(getCellValue(row.getCell(4))));
} else {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的时间值为空,请重试!"));
flag = false;
break;
}
if (getCellValue(row.getCell(5)) != null && !"".equals(getCellValue(row.getCell(5)))) {
cresrtest.setGeoLongitude(Float.parseFloat(getCellValue(row.getCell(5))));
} else {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的经度值为空,请重试!"));
flag = false;
break;
}
if (getCellValue(row.getCell(6)) != null && !"".equals(getCellValue(row.getCell(6)))) {
cresrtest.setGeoLatitude(Float.parseFloat(getCellValue(row.getCell(6))));
} else {
out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的纬度值为空,请重试!"));
flag = false;
break;
}
infos.add(cresrtest);
}
}
}
}
if(infos.size() != 0 && flag)
out.println(intoDataBase(infos));
else if(infos.size() == 0 && flag)
out.println(JsonReturn.createErrorMsgReturn("您上传的表格没有任何数据,请重新上传!"));
//out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public JsonReturn intoDataBase(List<C_RES_R_TEST> infos) {
// 判断导入数据库中是否出错的标志
boolean flag = true;
// 遍历解析Excel的实体集合
for (C_RES_R_TEST info : infos) {
// 判断订单编号是否存在(存在:做修改操作;不存在:做新增操作)
if (DbTools.isExistById(info.getSysIntId())) {
// update
if (DbTools.isExistForUpdate(info)) {
return JsonReturn.createErrorMsgReturn("表格中有数据已存在数据库,请修改!");
} else{
flag = DbTools.update(info);
}
} else {
// add
if (DbTools.isExistByAdd(info)) {
return JsonReturn.createErrorMsgReturn("表格中有数据已存在数据库,请修改!");
} else{
flag = DbTools.addForHaveId(info);
}
}
// 数据导入出错,马上退出循环
if (!flag)
break;
}
if (!flag)
return JsonReturn.createErrorMsgReturn("数据导入失败!");
else
return JsonReturn.createSuccessMsgReturn("数据导入成功!");
}
// 判断从Excel文件中解析出来数据的格式
public static String getCellValue(HSSFCell cell) {
String value = null;
// 简单的查检列类型
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:// 字符串
value = cell.getRichStringCellValue().getString();
break;
case HSSFCell.CELL_TYPE_NUMERIC:// 数字
double dd = (double) cell.getNumericCellValue();
value = Double.toString(dd);
break;
case HSSFCell.CELL_TYPE_BLANK:
value = "";
break;
case HSSFCell.CELL_TYPE_FORMULA:
value = String.valueOf(cell.getCellFormula());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:// boolean型值
value = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_ERROR:
value = String.valueOf(cell.getErrorCellValue());
break;
default:
break;
}
return value;
}
}
- 实体对象代码
package com.model;
import java.util.Date;
public class C_RES_R_TEST {
private int sysIntId;
private String locationName;
private String city;
private String county;
private Date time;
private Float geoLongitude;
private Float geoLatitude;
public int getSysIntId() {
return sysIntId;
}
public void setSysIntId(int sysIntId) {
this.sysIntId = sysIntId;
}
public String getLocationName() {
return locationName;
}
public void setLocationName(String locationName) {
this.locationName = locationName;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public Float getGeoLongitude() {
return geoLongitude;
}
public void setGeoLongitude(Float geoLongitude) {
this.geoLongitude = geoLongitude;
}
public Float getGeoLatitude() {
return geoLatitude;
}
public void setGeoLatitude(Float geoLatitude) {
this.geoLatitude = geoLatitude;
}
}
本文介绍了如何使用Apache POI框架对表格数据进行导出和导入,包括导入导出的流程、相关代码实现及示例。重点展示了如何使用HSSF模块对Microsoft Excel XLS格式文件进行操作,以及数据导出到Excel表格的具体步骤和Servlet的使用。
2912

被折叠的 条评论
为什么被折叠?



