如果用户在我的网页上按下公式按钮,我想创建一个 Excel 文件。我的第一个解决方案效果很好。用户按下按钮,服务器端java代码创建文件,执行java代码后,网络浏览器打开一个对话框,询问用户是否显示或保存excel文件。
但是我从客户那里得到了一些新的要求。如果用户按下公式按钮,则需要在执行服务器端 java 代码时显示动画 gif 图像,并且如果服务器端 java 代码完成,动画 gif 必须立即消失。
这是 Struts2 提交按钮,如果按下该按钮,它将启动 HTTP 请求:
<s:submit value="show Data" onclick="myJsFunction(); return false;" />
这是客户端代码,它创建 HTTP 请求并将其发送到我的 Struts2 Actionclass:
function myJsFunction(){
$.ajax({
type: "POST",
dataType: 'binary',
url: "myActionClass.action",
data: {//some necessary input values},
success: function(data){
console.log(data);
// js code to disappeared the animated gif image
}
});
}
这是创建二进制代码的 Java 代码:
private void returnExcelFileAsStream(final String filename) throws IOException {
final InputStream is = new FileInputStream(filename);
OutputStream os = null;
try {
response.setContentType("application/pdf");
response.setHeader("Cache-Control", "maxage=3600");
response.setHeader("Pragma", "public");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
os = response.getOutputStream();
int len;
byte buf[] = new byte[1024];
while ((len = is.read(buf)) > 0) {
os.write(buf, 0, len);
}
is.close();
os.close();
}
catch(Exception e){
// some exeception handling
}
}
这是Struts2的execute方法,它调用了returnExcelFileAsStream方法。
public String execute(){
// some Java code
returnExcelFileAsStream("MyExcelFile.xlsx")
return null;
}
这是我的 struts.xml 文件:
<action name="myActionClass" class="myPackage.myActionClass">
<result name="input" type="redirectAction">/WEB-INF/base/jsp/myJspPage.jsp</result>
</action>
现在有一个问题,网络浏览器无法打开用户对话框,该对话框要求用户显示或保存文件。使用 firebug,我在 HTTP 响应中看到一些神秘字符。我怎么解决这个问题?
我在 JavaScript 成功函数中没有看到任何操作来触发浏览器浏览新创建的 Excel 文件。如果您在短信中提到了这一点,但我错过了,我很抱歉,但我通常会这样做:
在ajax的成功方法上,我只需执行以下操作:
document.location='files/[新生成的文件名].xls';
然后浏览器重定向到该文件,它要么显示该文件,要么要求用户下载
最后,服务器端作业会清除此文件夹中 1 天或更旧的文件
我希望这有帮助
我就是这样做的。
行动:
public String export() throws Exception {
HttpServletResponse response = ServletActionContext.getResponse();
List<FrontProjectList> dataList = projectApplyBaseService
.query_ProjectApply3(pqc, 0, projectApplyBaseService
.count_queryTotalProject_consumption(pqc) + 1);
HSSFWorkbook workbook = exportExcel(dataList);
ByteArrayOutputStream output = new ByteArrayOutputStream();
workbook.write(output);
byte[] ba = output.toByteArray();
excelFile = new ByteArrayInputStream(ba);
output.flush();
output.close();
return "excel";
}
Struts.xml
<param name="contentType">application/vnd.ms-excel</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">1024</param>
<param name="inputName">excelFile</param>
</result>