一.导出到Excel
基本思路:点击导出后生成临时.xls文件,返回文件名,供用户下载,下载完后删除文件
带查询的导出(前端EasyUI),如下为导出界面图
下面为导出按钮绑定的函数:
var exportCondition={};//导出条件
//导出功能
function outputData(){
$.ajax({
type: "POST",
url: path+"/main/inputAndOutput/output",
data: exportCondition,
success: function (fileName) {
var downUrl = path+"/main/inputAndOutput/download?fileName=" + fileName;
window.location = downUrl;
}
});
}
//查询功能
function search(){
//按条件进行查询数据,首先我们得到数据的值
//得到用户输入的参数,取值有几种方式:$("#id").combobox('getValue'), $("#id").datebox('getValue'), $("#id").val()
//字段增加search_前缀字符,避免传递如URL这样的Request关键字冲突
var queryData = {
search_type: $("#search_type").combobox('getValue'),
search_address: $("#search_address").combotree("tree").tree("getSelected")!=null?$("#search_address").combotree("tree").tree("getSelected").id:"",
search_name: $("#search_name").textbox('getValue'),
search_year: $("#search_year").textbox('getValue'),
search_publicType: $("#search_publicType").textbox('getValue'),
search_publicName: $("#search_publicName").textbox('getValue'),
search_layout: $("#search_layout").combobox('getValue'),
search_status: $("#search_status").combobox('getValue')
}
//将值传递给
initGrid(queryData);
//将查询条件传递给导出
exportCondition = queryData;
}
后台:生成.xls文件,返回文件名
@RequestMapping(value="output",method=RequestMethod.POST)
@ResponseBody
public String output(HttpServletRequest request,HttpServletResponse response){
Map<String, Object> param = new HashMap<String, Object>();
List<YellowPagesResourceModel> list = new ArrayList<YellowPagesResourceModel>();
String fileName="";
try {
//获取查询条件
param = getQueryParam(request);
list = this.yellowpageResService.QueryAllForGridData(param);
if(list.size()>0){
//创建webbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
//设置表头及样式
HSSFSheet sheet = defineHeader(wb);
//填充数据
writeData(list, sheet);
//数据写入文件
fileName=writeToFile(wb);
}
} catch (Exception e) {
e.printStackTrace();
}
return fileName;
}
/**
* 设置表头和样式
* @param wb
* @return
*/
private HSSFSheet defineHeader(HSSFWorkbook wb) {
//添加sheet,对应Excel文件中sheet
HSSFSheet sheet = wb.createSheet("黄页资源(一)");
//创建表头
HSSFRow row = sheet.createRow(0);
//创建单元格,设置表头值
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中格式
HSSFCell cell = row.createCell(0);
cell.setCellValue("序号");
cell.setCellStyle(style);
cell = row.createCell(1);
cell.setCellValue("所属地市");
cell.setCellStyle(style);
cell = row.createCell(2);
cell.setCellValue("地区");
cell.setCellStyle(style);
cell = row.createCell(3);
cell.setCellValue("年份");
cell.setCellStyle(style);
cell = row.createCell(4);
cell.setCellValue("书名");
cell.setCellStyle(style);
cell = row.createCell(5);
cell.setCellValue("刊式代码");
cell.setCellStyle(style);
cell = row.createCell(6);
cell.setCellValue("刊式名称");
cell.setCellStyle(style);
cell = row.createCell(7);
cell.setCellValue("刊式尺寸");
cell.setCellStyle(style);
cell = row.createCell(8);
cell.setCellValue("价格");
cell.setCellStyle(style);
cell = row.createCell(9);
cell.setCellValue("版面");
cell.setCellStyle(style);
return sheet;
}
/**
* 写入数据到excel
* @param list
* @param sheet
*/
private void writeData(List<YellowPagesResourceModel> list, HSSFSheet sheet) {
HSSFRow row = null;
//写入数据
YellowPagesResourceModel model = null;
for(int i=0;i<list.size();i++){
row = sheet.createRow(i+1);
model = list.get(i);
row.createCell(0).setCellValue(i+1);
row.createCell(1).setCellValue(model.getAddress());
row.createCell(2).setCellValue(model.getAddressStr());
row.createCell(3).setCellValue(model.getPagesYear());
row.createCell(4).setCellValue(model.getPagesName());
row.createCell(5).setCellValue(model.getPublicCode());
row.createCell(6).setCellValue(model.getPublicName());
row.createCell(7).setCellValue(model.getPublicType());
row.createCell(8).setCellValue(model.getPrice().toString());
row.createCell(9).setCellValue(model.getLayout()==1?"普通版面":"特殊版面");
}
}
/**
* 数据写入磁盘文件
* @param wb
* @throws IOException
* @throws FileNotFoundException
*/
private String writeToFile(HSSFWorkbook wb) throws IOException,
FileNotFoundException {
// 读取配置文件获取实际保存路径
Properties props = PropertiesLoaderUtils.loadAllProperties("otherCfg.properties");
//实际保存路径
String saveDir = props.getProperty("PathToYellowPagesResFile_DEV");
File fileDir = new File(saveDir.toString());
if(!fileDir.exists()){
fileDir.mkdirs();
}
String fileName = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "-" +RandomUtils.nextInt();
String filePath = saveDir+File.separator+fileName+".xls";
FileOutputStream fout = new FileOutputStream(filePath);
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
wb.write(ostream);
fout.write(ostream.toByteArray());
fout.flush();
ostream.close();
fout.close();
return fileName+".xls";
}
文件下载在此就不多提,注意的是在下载完后记得删除上面生成的.xls文件,其次为了解决乱码,如下设置response
/**
* 解决附件下载名称乱码
* @param request
* @param response
* @param params
* @throws UnsupportedEncodingException
*/
private void solveGarbled(HttpServletRequest request,
HttpServletResponse response,
Map<String, String> params
) throws UnsupportedEncodingException{
if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") > -1){//IE浏览器
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(params.get("realFileName"), "iso-8859-1"));
}else if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > -1){//firefox浏览器
response.setContentType("application/x-xls");
response.addHeader("content-disposition", "attachment;filename=\"" + params.get("realFileName") + "\"");
}else{//其他浏览器
response.setContentType("application/x-xls");
response.addHeader("content-disposition", "attachment;filename=" + params.get("realFileName"));
}
}
导出.xls文件如下:
二.xls导入数据到数据库
基本思路:上传.xls,转换成.csv,读取数据,存入数据库
导入对话框如下所示:
如下为代码:
<div id="inputDlg" class="easyui-dialog" style="width:380px;height:220px;"
data-options="buttons: '#inputDlg-buttons',closed:true,modal: true">
<form id="uploadForm" method="post" enctype="multipart/form-data">
<table cellpadding="8">
<tr class="fitem">
<td>
<input id="uploadExcel" name="uploadExcel" class="easyui-filebox" style="width:250px;"
data-options="prompt:'请选择.xls文件...'">
</td>
</tr>
<tr class="fitem">
<td>
<label>黄页类型:</label><input id="uploadType" name="uploadType" class="easyui-combobox"/>
</td>
</tr>
</table>
</form>
<p style="color:red;font-size:12px;text-align:center;">请注意导入的Excel数据字段和
<a href="${pageContext.request.contextPath}/main/inputAndOutput/downloadTemplate">Excel模板</a>一致
</p>
</div>
<div id="inputDlg-buttons">
<a href="javascript:void(0)" class="easyui-linkbutton"
data-options="iconCls:'icon-save'" onclick="uploadFile()">上传</a>
<a id="uploadBtn" href="javascript:void(0)" class="easyui-linkbutton"
data-options="iconCls:'icon-cancel'"
onclick="javascript:$('#inputDlg').dialog('close')">取消</a>
</div>
//文件上传
function uploadFile(){
//得到文件路径
var filePath = $('#uploadExcel').filebox('getValue');
if(filePath!=""){
//对文件格式进行验证(简单验证)
var d1=/\.[^\.]+$/.exec(filePath);
if(d1==".xls"){
$('#uploadForm').form('submit',{
url: path+'/main/inputAndOutput/upload',
success: function(data){
if (data){
$('#inputDlg').dialog('close');
$("#grid").datagrid('reload');
} else {
$.messager.alert('操作提示',"导入失败,请检查数据是否正确!",'error');
}
}
});
}else{
$.messager.alert('温馨提示','请选择.xls文件!','warning');
}
}else{
$.messager.alert('温馨提示','请选择.xls文件!','warning');
}
}
后台:
@RequestMapping(value="upload")
@ResponseBody
public String upload(HttpServletRequest request,HttpServletResponse response) throws IOException{
String result=null;
//文件上传到磁盘
Map<String,String> map = uploadExcel(request);
String fileName = map.get("fileName");
Integer type =Integer.parseInt(map.get("type"));
List<String> dataList = new ArrayList<String>();
Properties props = PropertiesLoaderUtils.loadAllProperties("otherCfg.properties");
String saveDir = props.getProperty("PathToYellowPagesResFile_DEV");
String filePath = saveDir+File.separator+fileName;
try {
//.xls转换为.csv
XLS2CSVmra xls2csv = new XLS2CSVmra(filePath+".xls", filePath+".csv");
xls2csv.process();
//删除.xls
File file = new File(filePath+".xls");
if(file.exists())file.delete();
//获取.csv中数据
File csvFile = new File(filePath+".csv");
dataList = CSVUtils.importCsv(csvFile);
//删除.csv
csvFile.delete();
for(String s:dataList){
System.out.println(s);
}
if(dataList.size()>0){
//.csv中数据转换为entity
List<YellowPagesResource> instances = new ArrayList<YellowPagesResource>();
instances = convertToEntity(type, dataList);
//保存至数据库
this.yellowpageResService.createOrModify(instances);
result = "成功导入:"+instances.size()+"条数据.";
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
说明:
(1).xls转换为.csv,由于.csv以一行数据的字符串并用“,”分隔存放数据,所以可以实现一行一行地读取数据
apache官方的例子:实现.xls-->.csv和.xlsx--->.csv
XLS2CSV: http://www.docjar.com/html/api/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java.html
XLSX2CSV: https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java
(2)获取.csv的数据(注意设置编码集,否则容易乱码)
public static List<String> importCsv(File file){
List<String> dataList=new ArrayList<String>();
FileInputStream in = null;
BufferedReader br=null;
try {
in = new FileInputStream(file);
br = new BufferedReader(new InputStreamReader(in, "GBK"));//设置编码集
String line = "";
while ((line = br.readLine()) != null) {
dataList.add(line);
}
}catch (Exception e) {
}finally{
if(br!=null){
try {
br.close();
br=null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return dataList;
}
(3).csv中数据转换为entity
/**
* 将从csv中获取的数据转换成Entity
* @param type 资源类型
* @param dataList
*/
private List<YellowPagesResource> convertToEntity(Integer type, List<String> dataList) {
String[] cells = null;
List<YellowPagesResource> instances = new ArrayList<YellowPagesResource>();
for(int i=0;i<dataList.size();i++){
cells = dataList.get(i).replace("\"", "").split(",");
if(cells.length<10){
continue;
}else{
YellowPagesResource ypr = new YellowPagesResource();
ypr.setPagesName(cells[4]);
ypr.setPagesYear(cells[3]);
ypr.setAddress(cells[1]);
ypr.setPublicCode(cells[5]);
ypr.setPublicName(cells[6]);
ypr.setPublicType(cells[7]);
ypr.setStatus(2);//未销售
ypr.setCreator(SecurityUserHolder.getCurrentUser().getName());
ypr.setProductId("402881ea4c5e43fd014c60660ffd0000");//这个暂时写死的
ypr.setType(type);
if("特殊版面".equals(cells[9])){
ypr.setLayout(2);
}else if("普通版面".equals(cells[9])){
ypr.setLayout(1);
}else{
continue;
}
ypr.setPrice(BigDecimal.valueOf(Double.parseDouble(cells[8])));
instances.add(ypr);
}
}
return instances;
}
注:以上实例未给出验证上传的.xls数据格式是否合法,只是在转换为entity时简单判断了(这样是不行的!)
本文链接: POI Excel导入导出,转载请注明。