JAVA:将数据(从数据库)导出到excel并将其发送到客户端

如标题所示,我需要将一些数据(从数据库中获取)放入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>

而已。现在,当执行操作时,将提示用户保存或打开文件。

:)

以上是 JAVA:将数据(从数据库)导出到excel并将其发送到客户端 的全部内容, 来源链接: utcz.com/qa/429712.html

回到顶部