如标题所示,我需要将一些数据(从数据库中获取)放入Excel工作表中,然后将其发送到客户端,以便用户可以保存,打开或取消操作。
我看到了一些与此有关的文章,最近的是:如何让用户下载文件?(Java,MVC,Excel,POI)。参考史蒂文斯提供的链接,我尝试了以下代码:
public String execute(){
setContentDisposition("attachment; filename=\"" + ename + "\"");
try{
ServletContext servletContext = ServletActionContext.getServletContext();
String filePath = servletContext.getRealPath("/WEB-INF/template/excel/mytemplate.xls");
File file = new File(filePath);
Workbook wb = WorkbookFactory.create(new FileInputStream(file));
Sheet sheet = wb.getSheetAt(0);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
wb.write(baos);
InputStream excelStream;
excelStream = new ByteArrayInputStream(baos.toByteArray());
}catch(Exception e){
System.out.println(e.getMessage());
}
return SUCCESS;
}
首先这里WorkbookFactory
没有定义。其次,我无法正确理解代码的工作方式。
我还找到了此链接:http : //www.roseindia.net/answers/viewqa/Java-
Beginners/14930-How-to-export-data-from-database-to-excel-sheet-by-using-java-
-in-standalone-project.html
。但是这里excel文件被保存在服务器上。我希望该文件不应保存在服务器端,而应直接转到客户端
(如果有帮助)我正在使用:struts 2框架,休眠
我愿意使用POI API,jQuery或其他任何好东西。
displayTag
由于某种原因,我无法使用。
Javascript是我的最后选择(尽管我已经实现了),因为它需要更改浏览器的一些默认安全设置(如果可以避免的话,我也可以使用JavaScript)。
请告知我现在该如何处理。
谢谢!!
编辑:
<result-types>
<result-type name="jsp" class="org.apache.struts2.views.jsp"/>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
</result-types>
<action name="myActionName" class="package.myActionClass">
<result type="stream">
<param name="contentType">"application/vnd.ms-excel"</param>
<param name="inputName">excelStream</param>
<param name="contentDisposition">contentDisposition</param>
<param name="bufferSize">1024</param>
</result>
</action>
执行动作时的错误:
java.lang.reflect.InvocationTargetException
java.lang.IncompatibleClassChangeError: Class org.apache.poi.hssf.usermodel.HSSFWorkbook does not implement the requested interface org.apache.poi.ss.usermodel.Workbook
好的。所以最后,我克服了所有障碍,并找到了解决方法。
我意识到我面临的问题不是创建excel文件,而是将其发送到客户端,并且也没有在服务器上创建文件或临时文件。
因此,这是解决方法(我从原始代码中剥离了细节,以便您可以轻松理解它)。
在操作文件中,您首先必须创建一个HSSFWorkbook对象,将其放入数据,然后不将其保存到服务器上的磁盘,而是使用inputstream将其发送给客户端。
动作文件代码:
public String execute(){
setContentDisposition("attachment; filename=\"" + ename + ".xls\"");
try{
HSSFWorkbook hwb=new HSSFWorkbook();
HSSFSheet sheet = hwb.createSheet("new sheet");
//////You can repeat this part using for or while to create multiple rows//////
HSSFRow row = sheet.createRow(rowNum);
row.createCell(0).setValue("col0");
row.createCell(1).setValue("col1");
row.createCell(2).setValue("col2");
row.createCell(3).setValue("col3");
.
.
.
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//////Now you are ready with the HSSFworkbook object to be sent to client//////
///////////////////////////////////////////////////////////////////////////////
ByteArrayOutputStream baos = new ByteArrayOutputStream();
hwb.write(baos);
excelStream = new ByteArrayInputStream(baos.toByteArray());
///////////////////////////////////////////////////////////////////////////////
////Here HSSFWorkbook object is sent directly to client w/o saving on server///
///////////////////////////////////////////////////////////////////////////////
}catch(Exception e){
System.out.println(e.getMessage());
}
return SUCCESS;
}
现在,只需在struts-
config文件中编写(请注意,操作本身已设置了excelStream&contentDisposition,这里的结果类型为org.apache.struts2.dispatcher.StreamResult
):
<action name="actionName" class="actionClass">
<result type="stream">
<param name="contentType">"application/vnd.ms-excel"</param>
<param name="inputName">excelStream</param>
<param name="contentDisposition">contentDisposition</param>
<param name="bufferSize">1024</param>
</result>
</action>
而已。现在,当执行操作时,将提示用户保存或打开文件。
:)
问题内容: 我有这个小点击计数器。我想将每次单击都包含在mysql表中。有人可以帮忙吗? 万一有人想看看我做了什么: 这是phpfile.php,出于测试目的,将数据写入txt文件 问题答案: 您的问题中定义的JavaScript不能直接与MySql一起使用。这是因为它不在同一台计算机上运行。 JavaScript在客户端(在浏览器中)运行,并且数据库通常在服务器端存在。您可能需要使用中间服务器端
我有一个独立的H2服务器,正在收集数据。为了进行测试,我希望将数据从服务器中提取到CSV文件中。有什么工具吗?
我有一个关于Java插座的技术问题。 例如,假设我有一个Java Sockets服务器和n个多个客户端。是否可以几乎实时地将数据从服务器发送到任何或所有客户端? 更准确地说: 有哪种监听器可以在Sockets客户端中实现 有人能告诉我什么方法是最好的吗?此外,如果有人有一个代码示例,我也会很高兴。 谢谢
问题内容: 我正在尝试将MySQL数据保存到Excel文件,但是Excel单元格出现问题。我所有的文本都放在一个单元格中,我希望每个行值都在单独的Excel单元格中。这是我的代码: 问题答案: 尝试以下方法: PHP部分: 我认为这可以帮助您解决问题。
我正在Unity中制作一个游戏,我试图将数据从客户端发送到服务器并返回到客户端(试图保存实例),但当我收到数据并尝试将数据发送回客户端时,它表示udp客户端未连接。 它成功地将数据从我的Unity客户端发送到服务器,但一旦它到达那里,套接字就会断开连接,我就无法返回任何内容。正如你所看到的,我试图设置一些多播选项,但它似乎不能正常工作。 客户: 服务器: 因此,服务器中UdpClient的实例会保
我需要实现一个github授权,然后将接收到的数据(JSON)发送到客户端。 我找到了这篇教程http://shiya.io/how-to-do-3-legged-oauth-with-github-a-general-guide-by-example-with-node-js/ 在该教程中,开发人员向我们展示了如下内容:“/”->“/login”->“/redirect”->“/user”(此处