您的位置:首页 > 其它

文件下载-excel导出-我们到底能走多远系列(22)

2013-02-04 19:37 501 查看

我们到底能走多远系列(22)

扯淡:老规矩,先扯淡,老实说,过年就是回家在亲戚面前吹吹牛喝喝酒,再听听别人的牛,然后回来继续苦逼....  

  所以不是你把别人吹倒,就是别人把你吹倒,大家要加油吹哦!

-----------------------------------------

最近很多人纠结自己文章被别人抄袭的事。

我一直想不明白:自己写的博客被人抄袭,甚至当成别人的原创这种情况对自己有多大的伤害?

我不明白:除了自己虚荣心上的一点挫折,其他损失还有多少呢?除了部分恶意的抄袭行为,的确要反对外。

我觉得:一个分享的行为,被放大,被传播,本来就是一件很nice,很cool的事。

我个人也会转文章,一般文章署名了,我也会会复制过来,没写的我也懒的一个个标记好是从哪里复制来的了,但是有一点是肯定的,虽然是复制粘贴的几秒钟,我是感谢作者的,至少我会倾佩他几秒,我觉得他教给我一些东西,无形的东西,但却可能有价值。

为什么要纠结别人对你文章的复制粘贴呢?

当你把一些思考,总结,经验贴到自己的博客后。一个月后在另一个博客上看到了自己文章,难道这件事反而会让各位生气吗?这在博客园里应该是件快乐的事情吧,想想自己文章被人反复阅读,并被记录下来,成为别人思想的一部分,这是多么有趣的一件事啊!
到了这里却被看成是有点罪恶感的事了。

写博客正真的收获的是什么?

1,写的时候自己的思考

2,写完后自己对自己文章的阅读重新思考

3,别人看了你的文章的反馈,然后你就可以再进行扩展思考。

整一个过程就是不断的促使自己思考的过程。只要这个过程还能促使你思考,写这篇博客就是有价值的,至少对自己是有的。

所以我个人觉得,还是不要太纠结别人的什么抄袭这种事,别人抄袭你只能代表别人觉得这篇博客有帮到他,觉得你不错,是吧。

主题:

1,下载文件

文件躺在服务器的某个文件夹下,页面点击下载,将文件保存到本地的过程:

action用springmvc实现:

public ModelAndView downloadModelForm(HttpServletRequest request, HttpServletResponse response) throws Exception{
response.setContentType("application/octet-stream");
String fileName = "用户申请表.docx";
String path = request.getSession().getServletContext().getRealPath(BusinessConstants.DOWNLOAD_FILE_PATH + fileName);

File file = new File(path);

// 清空response
response.reset();

if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0){
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
}
else{
fileName = URLEncoder.encode(fileName, "UTF-8");//其他浏览器包括IE浏览器和google浏览器
}

// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="+  fileName);
response.addHeader("Content-Length", ""+file.length());

try{
//以流的形式下载文件
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();

OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
toClient.write(buffer);
toClient.flush();
toClient.close();
}catch(Exception e){
e.printStackTrace();
}
return null;
}


特别要注意的是代码是哦那个对fileName 编码逻辑,根据不同浏览器来实现不同的编码,这样做是为了在输出文件名时可以使用中文名。

测试对firefox,ie8,谷歌通过,可用。如果不做操作,结果是文件名使用中文的话会出现乱码问题。(可能这只是一种解决方案,如果你有更好的解决方式,请告诉我哦)

2,导出excle文件:

导出的是账单表的内容,数据需要先去数据库中取的,组装成excel。

这里使用最新的pio3.9(开源项目),来完成excel的导出:

service层的方法:组装出一个完整内容的HSSFWorkbook

public HSSFWorkbook export(List<Sale> list) {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(BusinessConstants.EXCEL_SHEET_NAME);
HSSFRow row = sheet.createRow((int) 0);
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
String[] excelHeader = BusinessConstants.EXCEL_HEADER;
for (int i = 0; i < excelHeader.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(excelHeader[i]);
cell.setCellStyle(style);

sheet.autoSizeColumn(i);
}
SimpleDateFormat sdf = new SimpleDateFormat(BusinessConstants.DATE_FORMAT);
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(i + 1);
Sale sale = list.get(i);
row.createCell(0).setCellValue(sdf.format(sale.getTime()));
//setCellValue方法参数不能是null,会导致异常,所以对每一个内容进行必要的检查
if(sale.getStrType() == null){
row.createCell(1).setCellValue(BusinessConstants.STRIKE);
}else{
row.createCell(1).setCellValue(sale.getStrType());
}

if(sale.getStrPayType() == null){
row.createCell(2).setCellValue(BusinessConstants.STRIKE);
}else{
row.createCell(2).setCellValue(""+sale.getStrPayType());
}

if(sale.getAmount() == null){
row.createCell(3).setCellValue(BusinessConstants.STRIKE);
}else{
row.createCell(3).setCellValue(sale.getAmount());
}

if(sale.getProductNum() == null){
row.createCell(4).setCellValue(BusinessConstants.STRIKE);
}else{
row.createCell(4).setCellValue(sale.getProductNum());
}

if(sale.getProductValid() == null){
row.createCell(5).setCellValue(BusinessConstants.STRIKE);
}else{
row.createCell(5).setCellValue(sale.getProductValid());
}

if(sale.getProductName() == null){
row.createCell(6).setCellValue(BusinessConstants.STRIKE);
}else{
row.createCell(6).setCellValue(sale.getProductName());
}

}
return wb;
}


action层的代码:

public ModelAndView downloadBill(HttpServletRequest request, HttpServletResponse response) throws IOException {
User user = (User) request.getSession().getAttribute("user");
List<Sale> saleList = accountService.getSale(user.getId(), null, null, 0);
HSSFWorkbook wb = accountService.export(saleList);

// 清空response
response.reset();
String fileName = "";
if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0){
fileName = new String(BusinessConstants.EXCEL_FILE_NAME.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
}
else{
fileName = URLEncoder.encode(BusinessConstants.EXCEL_FILE_NAME, "UTF-8");//其他浏览器包括IE浏览器和google浏览器
}

response.setContentType("application/vnd.ms-excel");//Office2003
response.setHeader("Content-disposition", "attachment;filename="+fileName);
OutputStream ouputStream = response.getOutputStream();
wb.write(ouputStream);
ouputStream.flush();
ouputStream.close();
return null;
}


同样的我们需要对fileName进行编码上的设置,以使可以正常使用中文名。

如果进行操作,效果可能是这样的:



导出效果:



以上,希望能帮到你。

补充(2013/08/23):

一个方便的方法是,导出时使用csv格式,windows下打开如果有excel会默认打开的,效果基本和使用上面的excel框架相同。当然一些excel的特殊处理就不行了:

有兴趣的可以尝试一下,瞬间完成需求。好处就是不依赖其他框架,修改迅速。

List<WinnerDO> winners = awardService.getWinnerListByTime(beginDate, endDate);

PrintWriter osw = null;
BufferedWriter out = null;
try {
response.reset();
response.setCharacterEncoding("gb2312");
response.setContentType("text/csv");
response.addHeader("Content-Disposition", "attachment;filename=export.csv");
osw = response.getWriter();
out = new BufferedWriter(osw);
out.write("ID,用户名,电话号码,EMAIL,奖品,获奖时间");
out.newLine();
for (WinnerDO winner : winners) {
out.write(winner.getId() + "," + winner.getName() + "," + winner.getPhone() + "," + winner.getEmail()
+ "," + winner.getAwardName() + "," + WXDateUtil.toLocaleString(winner.getEditTime()));
out.newLine();
}
out.close();
osw.close();
} catch (Exception e) {
System.err.println("export error: " + e);
e.printStackTrace();
}


各位,新年快乐!

让我们继续前行

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不会成功。
共勉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: