Java服务器做Excel导出遇到异常

Java服务器做Excel导出遇到异常,第1张

这个异常产生的常见原因如下:

1、客户端因为网络原因断开连接了(例如拔网线)

2、客户端在服务器向Response的输出流写入内容前就强行中断了连接(例如在下载框出现之前就点了“停止”按钮)

3、Excel文件生成的过程太久了,客户端程序达到超时时间,主动断开了连接。

4、Nginx之类的负载均衡达到超时时间,断开了负载均衡服务器与应用服务器的连接。

建议:

只要能排除第3、4,就不是程序的问题,就没事了。

在保护状态下execl的格式有可能正在被使用,你这边修改,准确说是线程冲突,一般excel值会作为导出文件的模板,是不会编辑的。你可以在读的时候判断execl是否正在被使用。

下面的代码问题,你可以参考

package com.hwt.glmf.common

import java.io.IOException

import java.io.OutputStream

import java.util.ArrayList

import java.util.List

import javax.servlet.http.HttpServletResponse

import org.apache.poi.hssf.usermodel.HSSFCell

import org.apache.poi.hssf.usermodel.HSSFCellStyle

import org.apache.poi.hssf.usermodel.HSSFFont

import org.apache.poi.hssf.usermodel.HSSFRichTextString

import org.apache.poi.hssf.usermodel.HSSFRow

import org.apache.poi.hssf.usermodel.HSSFSheet

import org.apache.poi.hssf.usermodel.HSSFWorkbook

import org.apache.poi.hssf.util.CellRangeAddress

import org.apache.poi.hssf.util.HSSFColor

/**

* 导出Excel公共方法

* @version 1.0

*

* @author wangcp

*

*/

public class ExportExcel extends BaseAction {

//显示的导出表的标题

private String title

//导出表的列名

private String[] rowName

private List<Object[]> dataList = new ArrayList<Object[]>()

HttpServletResponse response

//构造方法,传入要导出的数据

public ExportExcel(String title,String[] rowName,List<Object[]> dataList){

this.dataList = dataList

this.rowName = rowName

this.title = title

}

/*

* 导出数据

* */

public void export() throws Exception{

try{

HSSFWorkbook workbook = new HSSFWorkbook()// 创建工作簿对象

HSSFSheet sheet = workbook.createSheet(title) // 创建工作表

// 产生表格标题行

HSSFRow rowm = sheet.createRow(0)

HSSFCell cellTiltle = rowm.createCell(0)

//sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】

HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook)//获取列头样式对象

HSSFCellStyle style = this.getStyle(workbook) //单元格样式对象

sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length-1)))

cellTiltle.setCellStyle(columnTopStyle)

cellTiltle.setCellValue(title)

// 定义所需列数

int columnNum = rowName.length

HSSFRow rowRowName = sheet.createRow(2) // 在索引2的位置创建行(最顶端的行开始的第二行)

// 将列头设置到sheet的单元格中

for(int n=0n<columnNumn++){

HSSFCell cellRowName = rowRowName.createCell(n) //创建列头对应个数的单元格

cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING)//设置列头单元格的数据类型

HSSFRichTextString text = new HSSFRichTextString(rowName[n])

cellRowName.setCellValue(text)//设置列头单元格的值

cellRowName.setCellStyle(columnTopStyle) //设置列头单元格样式

}

//将查询出的数据设置到sheet对应的单元格中

for(int i=0i<dataList.size()i++){

Object[] obj = dataList.get(i)//遍历每个对象

HSSFRow row = sheet.createRow(i+3)//创建所需的行数

for(int j=0j<obj.lengthj++){

HSSFCell cell = null //设置单元格的数据类型

if(j == 0){

cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC)

cell.setCellValue(i+1)

}else{

cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING)

if(!"".equals(obj[j]) &&obj[j] != null){

cell.setCellValue(obj[j].toString()) //设置单元格的值

}

}

cell.setCellStyle(style) //设置单元格样式

}

}

//让列宽随着导出的列长自动适应

for (int colNum = 0colNum <columnNumcolNum++) {

int columnWidth = sheet.getColumnWidth(colNum) / 256

for (int rowNum = 0rowNum <sheet.getLastRowNum()rowNum++) {

HSSFRow currentRow

//当前行未被使用过

if (sheet.getRow(rowNum) == null) {

currentRow = sheet.createRow(rowNum)

} else {

currentRow = sheet.getRow(rowNum)

}

if (currentRow.getCell(colNum) != null) {

HSSFCell currentCell = currentRow.getCell(colNum)

if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {

int length = currentCell.getStringCellValue().getBytes().length

if (columnWidth <length) {

columnWidth = length

}

}

}

}

if(colNum == 0){

sheet.setColumnWidth(colNum, (columnWidth-2) * 256)

}else{

sheet.setColumnWidth(colNum, (columnWidth+4) * 256)

}

}

if(workbook !=null){

try

{

String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls"

String headStr = "attachmentfilename=\"" + fileName + "\""

response = getResponse()

response.setContentType("APPLICATION/OCTET-STREAM")

response.setHeader("Content-Disposition", headStr)

OutputStream out = response.getOutputStream()

workbook.write(out)

}

catch (IOException e)

{

e.printStackTrace()

}

}

}catch(Exception e){

e.printStackTrace()

}

}

/*

* 列头单元格样式

*/

public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {

// 设置字体

HSSFFont font = workbook.createFont()

//设置字体大小

font.setFontHeightInPoints((short)11)

//字体加粗

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD)

//设置字体名字

font.setFontName("Courier New")

//设置样式

HSSFCellStyle style = workbook.createCellStyle()

//设置底边框

style.setBorderBottom(HSSFCellStyle.BORDER_THIN)

//设置底边框颜色

style.setBottomBorderColor(HSSFColor.BLACK.index)

//设置左边框

style.setBorderLeft(HSSFCellStyle.BORDER_THIN)

//设置左边框颜色

style.setLeftBorderColor(HSSFColor.BLACK.index)

//设置右边框

style.setBorderRight(HSSFCellStyle.BORDER_THIN)

//设置右边框颜色

style.setRightBorderColor(HSSFColor.BLACK.index)

//设置顶边框

style.setBorderTop(HSSFCellStyle.BORDER_THIN)

//设置顶边框颜色

style.setTopBorderColor(HSSFColor.BLACK.index)

//在样式用应用设置的字体

style.setFont(font)

//设置自动换行

style.setWrapText(false)

//设置水平对齐的样式为居中对齐

style.setAlignment(HSSFCellStyle.ALIGN_CENTER)

//设置垂直对齐的样式为居中对齐

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER)

return style

}

/*

* 列数据信息单元格样式

*/

public HSSFCellStyle getStyle(HSSFWorkbook workbook) {

// 设置字体

HSSFFont font = workbook.createFont()

//设置字体大小

//font.setFontHeightInPoints((short)10)

//字体加粗

//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD)

//设置字体名字

font.setFontName("Courier New")

//设置样式

HSSFCellStyle style = workbook.createCellStyle()

//设置底边框

style.setBorderBottom(HSSFCellStyle.BORDER_THIN)

//设置底边框颜色

style.setBottomBorderColor(HSSFColor.BLACK.index)

//设置左边框

style.setBorderLeft(HSSFCellStyle.BORDER_THIN)

//设置左边框颜色

style.setLeftBorderColor(HSSFColor.BLACK.index)

//设置右边框

style.setBorderRight(HSSFCellStyle.BORDER_THIN)

//设置右边框颜色

style.setRightBorderColor(HSSFColor.BLACK.index)

//设置顶边框

style.setBorderTop(HSSFCellStyle.BORDER_THIN)

//设置顶边框颜色

style.setTopBorderColor(HSSFColor.BLACK.index)

//在样式用应用设置的字体

style.setFont(font)

//设置自动换行

style.setWrapText(false)

//设置水平对齐的样式为居中对齐

style.setAlignment(HSSFCellStyle.ALIGN_CENTER)

//设置垂直对齐的样式为居中对齐

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER)

return style

}

}

java导出word嵌入excel打不开解决方法如下:

1、将导出的word文档另存为word97-2003文档格式(.doc),然后再次打开并保存,将word97-2003文档格式转换为Word2007及以上格式(.docx)。

2、尝试将excel表格单独保存为excel97-2003工作簿格式(.xls),然后将其嵌入到word文档中。

3、使用更高版本的ApachePOI或其他相关工具,以确保生成的word文档和excel表格格式兼容。

4、尝试使用其他工具,如Aspose等,以确保生成的word文档和excel表格格式兼容。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12007177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存