action 中代码:
// 文件名
String fileName = glRoadPart.getPartName()+"【"+pdMaintenanceQuality.getStartNum()+"—"+pdMaintenanceQuality.getEndNum()+"】"+pdMaintenanceQuality.getAssessMan()+DateUtil.convertDateToString(pdMaintenanceQuality.getAssessDate())+System.currentTimeMillis()+".xls";
// 目录
String directory = this.servlet.getServletContext().getRealPath("temp");
if (!FileUtil.isDirectoryExist(directory)) {
FileUtil.createDirectory(directory);
}
//新建Excel文件
String filePath = directory+"/"+fileName;
File excleFile=new File(filePath);
if (!excleFile.exists()) {
excleFile.createNewFile();
}
OutputStream outf = new FileOutputStream(excleFile);
WritableWorkbook workbook = Workbook.createWorkbook(outf);
AssessmentExportExcelUtil.getInstance().exportAll(workbook, pdMaintenanceQuality, glRoadSurfaceInfo, glRoadPart, this.servlet.getServletContext());
workbook.write();
workbook.close(); //一定要关闭, 否则没有保存Excel
outf.close();
// 设置响应类型和响应首部
response.setContentType("application/vnd.ms-excel");
// UploadFile.downloadFile(request, response, excleFile);
UploadFile.downloadFileByInputStream(request, response, excleFile);
//删除文件
FileUtil.deleteFile(excleFile);
下载代码:
/**
* 下载文件
* @param request
* @param response
* @param file
* @return
* @throws IOException
*/
public static boolean downloadFileByInputStream(HttpServletRequest request, HttpServletResponse response, File file) throws IOException {
if (file!=null) {
InputStream fileInput = null;
OutputStream filetoClient = null;
try {
fileInput = new FileInputStream(file);
filetoClient = response.getOutputStream();
byte[] buffer = new byte[1024*8];
int len=0;
// 写入输出流
while((len = fileInput.read(buffer)) != -1){
filetoClient.write(buffer, 0, len);
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(file.getName(), "UTF-8") + "\"");
} catch (IOException e) {
log.error("can not download", e);
e.printStackTrace();
response.sendError(405, "File cannot found!");
return false;
} finally {
try {
if (fileInput != null) {
fileInput.close();
}
fileInput = null;
if (filetoClient != null) {
filetoClient.flush();
filetoClient.close();
}
filetoClient =null;
} catch (IOException e) {
log.error("can not download", e);
e.printStackTrace();
response.sendError(405, "download error!");
return false;
}
}
return true;
} else {
log.error(" file is null");
response.sendError(405, "File cannot found!");
return false;
}
}
注:下载文件试过用 Writer 和 Reader 实现,但下载下来的文件有文件,不知是不是 Struts 的 writer 实现不同
写 excel 帮助类(懒得整理了,整个代码弄上来吧)
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import org.apache.commons.lang.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.xx.xx.yy.model.GlRoadPart;
import com.xx.xx.yy.model.GlRoadSurfaceInfo;
import com.xx.xx.xx.model.PdAssessItem;
import com.xx.xx.xx.model.PdMaintenanceQuality;
import com.xx.xx.xx.vo.ColumnVo;
import com.xx.xx.system.service.AppCodeManager;
import com.xx.xx.system.util.DateUtil;
public final class AssessmentExportExcelUtil {
private static AssessmentExportExcelUtil instance;
/** 私有构造方法,以防外部类 new 出实例 */
private AssessmentExportExcelUtil(){}
public static synchronized AssessmentExportExcelUtil getInstance() {
if (instance==null) {
instance = new AssessmentExportExcelUtil();
}
return instance;
}
public synchronized void exportAll(WritableWorkbook workbook, PdMaintenanceQuality pdMaintenanceQuality, GlRoadSurfaceInfo glRoadSurfaceInfo, GlRoadPart glRoadPart, ServletContext servletContext) throws InterruptedException {
GlRoadSurfaceInfo glRoadSurfaceInfo, GlRoadPart glRoadPart, ServletContext servletContext) {
List<PdAssessItem> pdAssessItems = AssessmentUtil.getInstance().getPdAssessItems(pdMaintenanceQuality, this.EQUIPMENT_CODE);
AppCodeManager appCodeManager = (AppCodeManager) getBean("appCodeManager", servletContext);
String direction = appCodeManager.getAppCodesByCategory(216, pdMaintenanceQuality.getDirection()).getCodeName();
List<ColumnVo> columnVos= this.getSurveryTypeContents(this.EQUIPMENT_CODE);
String sheetName = "sheet 1";
WritableSheet sheet = workbook.createSheet(sheetName, 4);
WritableFont wf = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD, false);//设置写入字体
try {
// title 单元格样式,加粗居中
WritableCellFormat centerBoldFormat = new WritableCellFormat(wf);
// 设置细边框
centerBoldFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
// 单元格居中对齐
centerBoldFormat.setAlignment(Alignment.CENTRE);
centerBoldFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
centerBoldFormat.setWrap(true);
// title 单元格样式,加粗靠左对齐
WritableCellFormat leftBoldFormat = new WritableCellFormat(wf);
// 设置细边框
leftBoldFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
// 单元格靠左对齐
leftBoldFormat.setAlignment(Alignment.LEFT);
// 正文字样式
WritableCellFormat normalFormat = new WritableCellFormat();
normalFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
normalFormat.setAlignment(Alignment.CENTRE);
normalFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
// 标题样式
WritableCellFormat titleFormat = new WritableCellFormat(wf);
titleFormat.setAlignment(Alignment.CENTRE);
titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
int r = 0;
// 写 title
sheet.addCell(new Label(0, r++, sheetName+"损坏调查表", titleFormat));
// 合并第 0 行至第一行的1至16单元格
sheet.mergeCells(0, 0, 15, r++);
// 写表头
WritableCell labelCF = new Label(0, r, " 路线名称:"+glRoadPart.getPartName(), leftBoldFormat);
sheet.addCell(labelCF);
sheet.setColumnView(0, 25);
labelCF = new Label(1, r, " 调查方向:"+direction, leftBoldFormat);
sheet.addCell(labelCF);
// 合并2~5单元格
sheet.mergeCells(1, r, 4, r);
labelCF = new Label(5, r, " 调查时间:"+DateUtil.convertDateToString(pdMaintenanceQuality.getAssessDate())+" 调查人员:"+pdMaintenanceQuality.getAssessMan(), centerBoldFormat);
sheet.addCell(labelCF);
// 合并5~15单元格
sheet.mergeCells(5, r, 15, r++);
labelCF = new Label(0, r, "调查内容", centerBoldFormat);
sheet.addCell(labelCF);
// 合并1~3行
sheet.mergeCells(0, r, 0, r+2);
// 设置单元格宽度
for (int i = 1; i < 16; i++) {
sheet.setColumnView(i, 5);
}
labelCF = new Label(1, r, "程度", centerBoldFormat);
sheet.addCell(labelCF);
sheet.mergeCells(1, r, 1, r+2);
labelCF = new Label(2, r, "单位扣分", centerBoldFormat);
sheet.addCell(labelCF);
sheet.mergeCells(2, r, 2, r+2);
labelCF = new Label(3, r, "权重Wi", centerBoldFormat);
sheet.addCell(labelCF);
sheet.mergeCells(3, r, 3, r+2);
labelCF = new Label(4, r, "计量单位", centerBoldFormat);
sheet.addCell(labelCF);
sheet.mergeCells(4, r, 4, r+2);
// 设为无下边框
WritableCellFormat tempFormat1 = new WritableCellFormat(wf);
tempFormat1.setBorder(Border.TOP, BorderLineStyle.THIN);
tempFormat1.setBorder(Border.LEFT, BorderLineStyle.THIN);
tempFormat1.setBorder(Border.RIGHT, BorderLineStyle.THIN);
tempFormat1.setAlignment(Alignment.CENTRE);
labelCF = new Label(5, r, "起点桩号:"+pdMaintenanceQuality.getStartNum()+" 终点桩号:"+pdMaintenanceQuality.getEndNum(), tempFormat1);
sheet.addCell(labelCF);
sheet.mergeCells(5, r, 14, r);
labelCF = new Label(15, r, "累计损坏", centerBoldFormat);
sheet.addCell(labelCF);
sheet.mergeCells(15, r, 15, r+2);
r++;
// 设为无下边框
WritableCellFormat tempFormat2 = new WritableCellFormat(wf);
tempFormat2.setBorder(Border.BOTTOM, BorderLineStyle.THIN);
tempFormat2.setBorder(Border.LEFT, BorderLineStyle.THIN);
tempFormat2.setBorder(Border.RIGHT, BorderLineStyle.THIN);
tempFormat2.setAlignment(Alignment.CENTRE);
labelCF = new Label(5, r, "路段长度:"+pdMaintenanceQuality.getRoadLength()+" 路面宽度:"+glRoadSurfaceInfo.getRoadSurfaceWidth(), tempFormat2);
sheet.addCell(labelCF);
sheet.mergeCells(5, r, 14, r++);
for (int i = 1; i < 11; i++) {
labelCF = new Label(4+i, r, i+"", centerBoldFormat);
sheet.addCell(labelCF);
}
r++;
int count = columnVos.size();
// 写表格体
for (int i=0;i<count;i++) {
int start = r;
ColumnVo col = (ColumnVo)columnVos.get(i);
String unit = col.getUnit();
// 替换平方米
if (unit != null && unit.endsWith("</sup>")) {
unit = "㎡";
}
// 程度
List<String> scopes = col.getScope();
// 程度代码
List<String> scopeCodes = col.getScopeCode();
// 单位扣分
List<String> dedUcts = col.getDeduct();
// 权重
List<String> powers = col.getPower();
int size = dedUcts.size();
// 调查内容
labelCF = new Label(0, start, col.getContent(), normalFormat);
sheet.addCell(labelCF);
// 权重
labelCF = new Label(3, start, powers.get(0), normalFormat);
sheet.addCell(labelCF);
// 计量单位
labelCF = new Label(4, start, unit, normalFormat);
sheet.addCell(labelCF);
int end = start + size -1;
if (size>1) {
sheet.mergeCells(0, start, 0, end);
sheet.mergeCells(3, start, 3, end);
sheet.mergeCells(4, start, 4, end);
r = end;
}
for (int j = 0; j < size; j++) {
String scope = scopeCodes.get(j);
List<PdAssessItem> items = this.filterPdAssessItems(pdAssessItems, col.getContentCode(), scope);
labelCF = new Label(1, start+j, scopes.get(j), normalFormat);
sheet.addCell(labelCF);
labelCF = new Label(2, start+j, dedUcts.get(j), normalFormat);
sheet.addCell(labelCF);
Double total = new Double("0");
// 十个调查格
for (int k = 1; k <= 11; k++) {
if (k==11) {
labelCF = new Label(4+k, start+j, this.formatNumber(total), normalFormat);
sheet.addCell(labelCF);
} else {
Double value = this.getValue(items, k);
String valueStr = "";
if (value != null){
total += value;
valueStr = value.toString();
}
labelCF = new Label(4+k, start+j, valueStr, normalFormat);
sheet.addCell(labelCF);
}
}
}
r++;
}
} catch (WriteException e) {
e.printStackTrace();
}
}
/**
* 根据 bean 名称从指定的 servletContext 获取实例
* @param name
* @param servletContext
* @return
*/
private Object getBean(String name, ServletContext servletContext) {
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
return ctx.getBean(name);
}
}
分享到:
相关推荐
在Java编程环境中,处理Excel文件是一项常见的任务,而JXL库提供了一个简洁的API来实现这一功能。JXL是一个开源的Java库,专门用于读取和写入Microsoft Excel文件(.xls格式)。在这个示例中,我们将深入探讨如何...
这篇博客“JXL 下载 Excel 文档”可能是介绍如何使用JXL库在Java程序中创建、读取或修改Excel文件。 描述中提到的链接指向了一个ITEYE博客文章,虽然具体内容没有给出,但我们可以推测博主可能详细介绍了使用JXL库...
### 使用JXL库下载并处理Excel文件 #### 知识点概述 本文将详细介绍如何使用JXL库结合Java网络编程技术来实现从指定URL下载Excel文件,并将其保存到本地指定目录的功能。此外,我们还将简单介绍如何使用JXL库读取...
在Java编程环境中,处理Excel文件是一项常见的任务,而JXL库提供了一个简洁的API来实现这一功能。JXL是一个开源的Java库,专门用于读取和写入Microsoft Excel文件(.xls格式)。在这个"JXL读写Excel小例子"中,我们...
Java中的JXL库是一个广泛使用的库,用于读取和写入Microsoft Excel文件。这个库使得在Java应用程序中处理Excel数据变得简单,而无需依赖于Microsoft Office。以下是对JXL库在进行Excel读写操作时的一些关键知识点的...
尽管Android原生并不支持直接操作Excel文件,但由于JXL是基于Java的,它可以在Android环境中运行,只要确保你的Android项目能够处理Java的标准库依赖。 JXL的主要功能包括: 1. **读取Excel文件**:JXL可以读取...
本篇将详细介绍如何利用`jxl`库来操作Excel文件,并结合实例说明如何从Excel文件中提取数据并生成TXT文件。 首先,我们需要理解`jxl`库的基本结构。`jxl`库主要提供了`Workbook`、`Sheet`、`Cell`等类,分别对应...
标题 "SSH+JXL 下载 Excel 文档" 涉及到的是在Java开发中,使用Spring、Struts2框架以及JXL库来实现Excel文件的下载功能。SSH(Spring、Struts2、Hibernate)是Java领域常见的MVC架构,而JXL是一个流行的Java库,...
在"Struts2+JXL 下载 Excel 文档"的场景中,开发者通常会创建一个Action,这个Action负责生成Excel文档并提供下载。用户通过浏览器访问特定URL,Struts2框架接收到请求后,会路由到相应的Action。Action内部会利用...
上述代码中,`doGet`方法创建了一个Servlet,当用户访问特定URL时,Servlet会生成一个Excel文件并作为HTTP响应的一部分返回,浏览器通常会提示用户下载。 值得注意的是,JXL库只支持Excel 97-2003格式(.xls),...
`jxl`库允许开发者使用Java语言来读写Microsoft Excel文件,无需依赖于Excel应用程序本身。本文将详细介绍如何使用`jxl`库进行Excel操作,并提供一个简单的实例。 首先,`jxl.jar`是`jxl`库的主要组件,你需要将其...
Java编程语言提供了多种库来处理Excel文件,其中jxl是一个广泛使用的开源库,它使得在Java应用程序中读取和写入Excel文件变得简单。本文将详细介绍如何使用jxl库进行Excel文件的读写操作,以及适合初学者的关键知识...
在Java编程环境中,JXL库是一个非常流行的工具,用于读取和写入Microsoft Excel文件。JXL库提供了方便的API,使得开发者可以轻松地处理Excel数据,包括读取单元格内容、修改工作表、添加公式,以及本文重点讨论的...
Java Excel API(简称JXL)是一个广泛使用的开源库,它允许Java开发者轻松地读取、写入和修改Microsoft Excel文件。在"JXL读写Excel例子demo"中,我们将探讨如何利用JXL库来处理Excel数据。这个示例程序包含了一个名...
JXL库是一个广泛使用的开源库,它允许开发者在Java应用程序中方便地读取和写入Excel文件。本篇将详细介绍如何使用JXL进行Excel的读写操作,并提供一个在MyEclipse环境中可以直接运行的示例代码。 首先,你需要在...
### jxl操作Excel文件知识点详解 #### 一、jxl简介 jxl 是一款用于 Java 环境下的 Excel 操作库,由一位韩国开发者所编写。与 Apache POI 相比,jxl 的功能略显简单,但在中文支持方面表现出色。jxl API 不依赖于...
`jxl`库是一个流行的Java库,它允许开发者读取、写入和修改Excel文件。本教程将详细介绍如何使用`jxl`库在导出Excel时添加水印,以及涉及的核心类`WritableWorkbook`、`WritableSheet`和`WritableCellFormat`。 `...
JXL库是Java平台上用于处理Microsoft Excel文件的一个开源工具,它允许开发者在Java应用程序中方便地读取和写入Excel数据。本篇将详细介绍JXL API的使用,帮助你理解如何通过JXL来操作Excel文件。 1. **JXL简介** ...
Excel下载涉及从服务器生成Excel文件并提供给客户端下载。主要步骤如下: 1. 根据需要从数据库或其他数据源获取数据。 2. 使用JXL的`Workbook.createWorkbook()`方法创建一个新的工作簿对象。 3. 创建一个`Sheet`...