POI Excel导入导出 - milan's

标签: poi excel milan | 发表时间:2015-04-10 18:14 | 作者:milan's
出处:

一.导出到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导入导出,转载请注明。

相关 [poi excel milan] 推荐:

POI Excel导入导出 - milan's

- - 博客园_首页
   基本思路:点击导出后生成临时.xls文件,返回文件名,供用户下载,下载完后删除文件.    带查询的导出(前端EasyUI),如下为导出界面图.   下面为导出按钮绑定的函数:. var exportCondition={};//导出条件.      //按条件进行查询数据,首先我们得到数据的值.

使用POI操作Excel和Word

- - ITeye博客
前言:今天在项目中看到有小模块是上传Excel解释后保存到数据库的操作,好奇之下去了解了如何使用Apache POI操纵Excel和Word,以下为小分享.       POI是Apache下的一个项目,是用Java编写的开源框架,提供API供开发者直接操作Microsoft Office(Excel,Word,PowerPoint...).

POI处理Excel大文件的问题和解决方法

- - 编程语言 - ITeye博客
    最近在测试上传Excel2007大文件的功能,采用的是Apache POI工具.     发现POI在处理24MExce2007l文件的时候,几乎占用了2G的Heap Space..     由于Excel2007的文件是经过压缩的,其实数据都是存放在shareStringl.xml文件中.

解决POI大数据导出Excel内存溢出、应用假死

- - IT瘾-bigdata
最近公司一个06年统计项目在导出Excel时造成应用服务器内存溢出、假死现象;查看代码发现问题一次查询一整年的数据导致堆内存被撑爆(假死),随后改用批量查询往Excel中写数据,同样的问题又出现了. 随后在网上查阅了部分资料只是在POI大数据导出API的基础上写的demo示例无任何参考价值….

POI读写Word docx文件

- - 开源软件 - ITeye博客
使用 POI 读写 word docx 文件. 1     读docx文件. 1.1     通过XWPFWordExtractor读. 1.2     通过XWPFDocument读. 2     写docx文件. 2.1     直接通过XWPFDocument生成. 2.2     以docx文件作为模板.

PHP导出excel

- syeye - scofield PHP开发-SEO SEM
最近做一个项目,其中涉及到了数据导成excel的功能. 后来使用了 开源的 PHPExcel  http://phpexcel.codeplex.com/ 目前最新版是1.7.6. PHPExcel 可以生成 .xls 和 .xlsx (office2007). 比如设置 excel的title,keywords,description.

[简单] poi word2007简单图文混排

- - ITeye博客
       直接上代码:. POI_图文混排_S3_Test t = new POI_图文混排_S3_Test();. setTextFontInfo(p, false, false, "基本实验技能(常见实验仪器及基本操作)", "宋体", "000000",. setTextFontInfo(p, false, false, "班级:________.

Java读写Excel:Apache POI, JXL与OpenCSV

- - ITeye博客
前些日子把JXL替换为ApachePOI,原因很简单,JXL在2009年10月已经停止更新,并且不支持Excel 2007 OOXML (.xlsx)格式的文件. 事实上把JXL与POI进行比较并不公平,因为JXL只能够操作OLE2格式的Excel(即.xls),而POI则是能够读写xls(x)、doc(x)、ppt(x)的一整套解决方案.

Excel 数据分析

- - ITeye博客
用Excel做数据分析——直方图. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

Excel高级使用技巧

- demonhunterl - 互联网的那点事
如果直接输入“1/5”,系统会将其变为“1月5日”,解决办法是:先输入“0”,然后输入空格,再输入分数“1/5”. (2) 序列“001”的输入. 如果直接输入“001”,系统会自动判断001为数据1,解决办法是:首先输入“’”(西文单引号),然后输入“001”. 如果要输入“4月5日”,直接输入“4/5”,再敲回车就行了.