我正在编写一个groovy代码(在SoapUI工具中)来创建excel文件并定期将数据刷入其中。 这个想法是,如果由于某些异常/中断代码没有完成,我应该在excel中获取数据直到出现错误/问题的时间。
我正在使用outputStream.flush(),如下所示。 以下是我的示例代码。
import jxl.*
import jxl.write.*
import java.io.IOException;
import java.io.OutputStream;
WritableWorkbook workbook;
WritableSheet sheet;
try{
log.info (" >> Start");
def times;
def currentTime = times = new Date().format("dd-MM-yyyy HH-mm-ss");
OutputStream outputStream = new FileOutputStream("C:/Users/user1/Result-"+currentTime+".xls");
WorkbookSettings workbookSettings = new WorkbookSettings();
workbook = Workbook.createWorkbook(outputStream);
sheet = workbook.createSheet("Sample 1",0);
for(int i=0;i<10;i++){
Label noScenarioSetLabel1 = new Label(0, i, "NO SCENARIO SET FOR EXECUTION");
sheet.addCell(noScenarioSetLabel1);
outputStream.flush();
Thread.sleep(1000);
}
workbook.write();
workbook.close();
log.info (" >> End");
}catch(Exception exp){
log.error ("Some Exp occurred : "+exp.toString());
workbook.write();
workbook.close();
}
这不是每次刷新都写入数据。我在这里错过了什么吗?
答案 0 :(得分:0)
是。您没有为要刷新的流写入任何数据。
通过workbook.write()
方法将Excel数据写入输出流。你没有在for循环中调用该方法。因此,您可以在刷新前简单地调用workbook.write()
。
这是编写程序的Groovier方法:
import jxl.*
import jxl.write.*
log.info (" >> Start")
def times;
def currentTime = times = new Date().format("dd-MM-yyyy HH-mm-ss")
new FileOutputStream("C:/Users/user1/Result-${currentTime}.xls").withStream {outputStream ->
def workbook = Workbook.createWorkbook(outputStream)
def sheet = workbook.createSheet('Sample 1',0)
0.upto(9) {
sheet.addCell new Label(0, it, 'NO SCENARIO SET FOR EXECUTION')
workbook.write()
outputStream.flush()
Thread.sleep(1000)
}
workbook.write()
workbook.close()
log.info (" >> End")
}
答案 1 :(得分:0)
像这样的图书馆(比如说“文件制作者”)一般都有“完成前冲洗”的问题。 他们建造多层结构等,我猜,我几乎可以肯定,建筑的大部分是在关闭单元格,行,页面,工作表的时候完成的......
查看4级构造函数调用(打开),理论上flush应传播相同级别(相同或相反顺序)
智力运动: 如何刷新一半的行,这在输出文档中是正式的非法,没有End Of Row?或者:如何刷新具有不良细胞计数的行
免责声明:我不使用jxl,但很少使用其他文档接口。在非常深的结构文档中,iText几乎不可能成功刷新异常,是没有意义的。
如果您有异常风险,可能会在第一阶段将数据转换为更简单的结构(经典:地图,列表等),然后第二次通过(安全)并建立文档?