jxl问题 write的时候死住不动了 请问什么原因?

jackal81 2005-11-29 12:39:11
如题,我下载程序下载行数较少的时候是没有问题的,可是下载多行的时候就挺到了write()的地方了,没有任何报错,请问是什么原因?是不是缓冲区问题?我该如何解决那?
...全文
280 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Goldrush 2006-04-16
  • 打赏
  • 举报
回复
up up
linlin2005 2005-12-19
  • 打赏
  • 举报
回复
帮顶
cuiyingfeng 2005-12-19
  • 打赏
  • 举报
回复
这个很正常呀,你在io设备时,慢一些不是问题,重要的是这个问题看你怎么处理这种现象。
jackal81 2005-11-29
  • 打赏
  • 举报
回复
为啥没人回复????
常遇道 2005-11-29
  • 打赏
  • 举报
回复
这么长。帮你顶

jackal81 2005-11-29
  • 打赏
  • 举报
回复
呵呵,谢谢大家支持,多多帮忙啊
xieqiang824 2005-11-29
  • 打赏
  • 举报
回复
我也搞不清楚,等我问问经理看看,我才搞开发半年,也不是很熟,不好意思
jackal81 2005-11-29
  • 打赏
  • 举报
回复
int lastRowCount = 1;
int headerRowCount = 0;
int dataRowCount = 0;
int loopLength = ids.length;

if (re.usedForDown())

{
loopLength = 1;
}
else
{
// 将翻页制为无效
re.pageIndex.setEnabled(false);
re.setTableList(new ArrayList());
re.setPageIndex(re.pageIndex);

for(int i = 0 ;i < tableList.size();i++)
{
logger.info("查询个数:"+tableList.size());
logger.info("开始reload");
re.reload(((Table)tableList.get(i)).getId());
logger.info("结束reload");
}
tableList = re.getTableList();
}
for (int index = 0; index < loopLength; index++)
{
int currentRow = 0;
Header header ;
if (!re.usedForDown())
header = re.getHeader(ids[index]);
else
header = re.getHeader();
headerRowCount = header.getHeaderRows();
//logger.info(header);
//获得报表数据
Data data = ((Table)tableList.get(index)).getTableData();
dataRowCount = data.getRowNums();
if (index == 0)
{
sheet.mergeCells(1, 0, data.getColumnNums(), 0);
sheet.addCell(new Label(1, 0, title, wcf_title));


}
List headerRow;
HeaderItem hi = new HeaderItem();

//System.out.println(header.getHeaderRows());
for (; currentRow < header.getHeaderRows(); currentRow++)
{

//System.out.println(header.toString());
headerRow = header.getOneRow(currentRow + 1);
//System.out.println(headerRow);
for (int j = 0; j < headerRow.size(); j++)
{

hi = (HeaderItem) headerRow.get(j);

sheet.mergeCells(hi.getItemColumnNum(), hi
.getItemRowNum() + lastRowCount , hi.getItemColumnNum()
+ hi.getItemColumnSpan() - 1, hi
.getItemRowNum() + lastRowCount
+ hi.getItemRowSpan() - 1);
sheet.addCell(new Label(hi.getItemColumnNum(), hi
.getItemRowNum() + lastRowCount, hi.getItemName(), wcf_r));
}
logger.info("画完表头");

}

DataItem[] dataItems;
for (int i = 0; i < data.getRowNums(); i++)
{
if(i%1000 == 0)
logger.info("画到了:"+i);
for (int j = 0; j < header.getHeaderFrame()[1]; j++)
{


dataItems = data.getOneColumn(j);
if (dataItems[i].getItemRowNum() != -1)
{
sheet
.mergeCells(
dataItems[i].getItemColumnNum(),
dataItems[i].getItemRowNum()
+ currentRow + lastRowCount ,
dataItems[i].getItemColumnNum()
+ dataItems[i]
.getItemColumnSpan()
- 1, dataItems[i]
.getItemRowNum()
+ currentRow + lastRowCount
+ dataItems[i]
.getItemRowSpan()
- 1);
if (Special.canDouble(String.valueOf(dataItems[i]
.getItemValue())))
sheet.addCell(new Number(dataItems[i]
.getItemColumnNum(), dataItems[i]
.getItemRowNum()
+ currentRow + lastRowCount, Double.parseDouble(String
.valueOf(dataItems[i].getItemValue())),
wcf_r));
else
sheet
.addCell(new Label(
dataItems[i].getItemColumnNum(),
dataItems[i].getItemRowNum()
+ currentRow + lastRowCount,
""
+ (dataItems[i]
.getItemValue() == null ? ""
: dataItems[i]
.getItemValue()),
wcf_r));
}

}
}
lastRowCount += headerRowCount + dataRowCount + currentRow;
logger.info("画完报表");
}
Header header = ((ComplexTable)re.getTableList().get(0)).getTableHeader();
//System.out.println(header.toString());
List theRowHeader = header.getOneRow(header.getHeaderRows());
HeaderItem hi;
//计算每列宽度
for(int i = 0;i < theRowHeader.size();i++)
{
hi = (HeaderItem)theRowHeader.get(i);
System.out.println(hi);
if(!(hi.getItemWidth() == null || hi.getItemWidth().equals("")))
{
//System.out.println("in");
if(hi.getItemWidth().indexOf("%") != -1)
{

String doubleStr = new Double(((1024-5)/8)*percentToNumber(hi.getItemWidth())).toString();
sheet.setColumnView(i+1,Integer.parseInt(StrUtil.doubleToInt(doubleStr)));
//System.out.println(doubleStr);
}
else
{
sheet.setColumnView(i+1,(Integer.parseInt(hi.getItemWidth())-5)/8);


}
}
}
System.out.println("计算完宽度");
/** **********以上所写的内容都是写在缓存中的,下一句将缓存的内容写到文件中******** */
workbook.write();

System.out.println("完成写文件");
/** *********关闭文件************* */
workbook.close();
bExportSucc = true;
logger.info("over!");
} catch (Exception e)
{
e.printStackTrace();
System.out.println("在输出到EXCEL的过程中出现错误,错误原因:" + e.toString());
}
}
}

这是程序,到“计算完宽度”之前都是很快的,之后就到“over”就非常慢了,大家帮忙看看吧,谢谢
jackal81 2005-11-29
  • 打赏
  • 举报
回复
public void exlCreate(ReportEntry report, String path)
{
ReportEntry re = report;//获得报表体
List tableList = new ArrayList(re.getTableList());

Condition[] conditions = re.getConditions();//获得条件

String title = re.getTableTitle();//获得报表标题
boolean bExportSucc = false;
try
{
File f = new File(path);
f.createNewFile();
//以下开始输出到EXCEL
/**创建工作簿 */
WritableWorkbook workbook = Workbook.createWorkbook(new FileOutputStream(f));

/** 创建工作表* */
WritableSheet sheet = workbook.createSheet(title, 0);
/** **********设置页眉、页脚***************** */
sheet.setHeader("页眉", "", "第 &P 页,共 &N 页"); //设置页眉
sheet.setFooter("", "", "&D &T"); //设置页脚
/** 字体 */
WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 14,
WritableFont.BOLD);
WritableFont SmallFont = new WritableFont(WritableFont.ARIAL, 8);
//用于跨行
WritableCellFormat wcf_merge = new WritableCellFormat(NormalFont);
wcf_merge.setBorder(Border.ALL, BorderLineStyle.THIN); //线条
wcf_merge.setVerticalAlignment(VerticalAlignment.TOP); //垂直对齐
wcf_merge.setAlignment(Alignment.LEFT);
wcf_merge.setWrap(true); //是否换行

/** ************以下设置几种格式的单元格************ */
//用于标题
WritableCellFormat wcf_title = new WritableCellFormat(BoldFont);
wcf_title.setBorder(Border.NONE, BorderLineStyle.THIN); //线条
wcf_title.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_title.setAlignment(Alignment.CENTRE); //水平对齐
wcf_title.setWrap(true); //是否换行

//用于正文左
WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
wcf_left.setBorder(Border.ALL, BorderLineStyle.THIN); //线条
wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_left.setAlignment(Alignment.LEFT); //水平对齐
wcf_left.setWrap(false); //是否换行

// // 用于正文左没有边框
WritableCellFormat wcf_left_noborder = new WritableCellFormat(NormalFont);
wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN); //线条
wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_left.setAlignment(Alignment.LEFT); //水平对齐
wcf_left.setWrap(false); //是否换行

//用于正文右
WritableCellFormat wcf_right = new WritableCellFormat(SmallFont);
wcf_right.setBorder(Border.NONE, BorderLineStyle.THIN); //线条
wcf_right.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_right.setAlignment(Alignment.RIGHT);
wcf_right.setWrap(false); //是否换行

WritableCellFormat wcf_r = new WritableCellFormat(NormalFont);
wcf_r.setBorder(Border.ALL, BorderLineStyle.THIN); //线条
wcf_r.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直对齐
wcf_r.setAlignment(Alignment.LEFT);
wcf_r.setWrap(false); //是否换行

/*标题**/
String[] ids = ReportParser.getAllqueryId();
String orientation = ReportParser.getReportOrientation();

christina_sll 2005-11-29
  • 打赏
  • 举报
回复
学习
jackal81 2005-11-29
  • 打赏
  • 举报
回复
上面的程序都通过了,其实也不是死到那里了,就是到了workBook.write()的时候特别慢,10000条左右需要700多秒,有没有遇到过的?
断点也设了,其它设置的通过的都很快,整个过程放到了try块里了没有报错。
xieqiang824 2005-11-29
  • 打赏
  • 举报
回复
嗯,看下JXL包里面tutorial.html这个文件,里面都有介绍,很好的,不过是英文版的
nighthawk 2005-11-29
  • 打赏
  • 举报
回复
多设断点 DEBUG。单从你描述的现象,无法判断。
xieqiang824 2005-11-29
  • 打赏
  • 举报
回复
你把程序贴出来看看

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧