我在使用Apache POI将一些数据写入Excel工作表时遇到问题。 我的代码如下......
public class DataExp implements Serializable {
private static final Logger logger = Logger.getLogger(DataExp.class);
public static File exportToCsv(List<WebInOutTrx> givenList, List<DataExpTmplt> dataTmpltList) throws IOException {
String url = "D:\\";
File file = new File(url);
String csv = "D:\\Output.csv";
CSVWriter csvWriter = new CSVWriter(new FileWriter(csv), ',');
List<String[]> data = toStringArray(givenList, dataTmpltList);
csvWriter.writeAll(data);
csvWriter.close();
System.out.println(csv);
return file;
}
private static List<String[]> toStringArray(List<WebInOutTrx> givenList,
List<DataExpTmplt> dataTmpltList) throws FileNotFoundException {
List<String[]> records = new ArrayList<String[]>();
records.add(new String[]{"sndrName", "noteToBnf",
"sndrPhone","entryUser","sndrAdd"});
Iterator<WebInOutTrx> it = givenList.iterator();
while (it.hasNext()) {
WebInOutTrx trx = it.next();
records.add(new String[]{trx.getSndrName(),trx.getNoteToBnf(),trx.getSndrPhone(),
trx.getEntryUser(),trx.getSndrAdd()});
}
return records;
}
public static File exportToXLS(List<WebInOutTrx> givenList,
List<DataExpTmplt> dataTmpltList) throws IOException, SQLException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
String url = "D:\\";
File file = new File(url);
WebService iWeb = new WebService();
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Sample sheet");
int rowFlag = 0;
int rowCount=givenList.size();
int columnCount=dataTmpltList.size();
int columnFlag=0;
while (rowFlag != rowCount) {
Row row = sheet.createRow(rowFlag);
Iterator<WebInOutTrx> it = givenList.iterator();
while (columnFlag != columnCount) {
String fieldName = dataTmpltList.get(columnFlag).getFieldName();
Cell cell = row.createCell(columnFlag);
WebInOutTrx tempObj = givenList.get(rowFlag);
Object obj = PropertyUtils.getProperty(givenList.get(rowFlag), fieldName);
if (obj != null) {
cell.setCellValue(obj.toString());
}
columnFlag++;
}
rowFlag++;
}
FileOutputStream out = new FileOutputStream(new File("D:\\Result.xls"));
{
wb.write(out);
out.close();
}
return file;
}
}
这是我的测试课程:
public class DataExpTest {
public DataExpTest() {
}
private static WebService webService;
private static List<WebInOutTrx> webInOutList=new ArrayList<WebInOutTrx>();
private DataExp dataExp = new DataExp();
private List<DataExpTmplt> dataTmpltList = new ArrayList<DataExpTmplt> ();
@BeforeClass
public static void setUpClass() {
WebInOutTrx temp=new WebInOutTrx();
temp.setSndrName("Abc");
temp.setNoteToBnf("Abc Bnf addr");
temp.setSndrPhone("Abc phone");
temp.setEntryUser("Abc Entry USer");
temp.setSndrAdd("Abc Sndr Addr");
webInOutList.add(temp);
temp.setSndrName("Abc");
temp.setNoteToBnf("Abc Bnf addr1");
temp.setSndrPhone("Abc phone1");
temp.setEntryUser("Abc Entry USer1");
temp.setSndrAdd("Abc Sndr Addr1");
webInOutList.add(temp);
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
dataTmpltList.add(new DataExpTmplt(1, "sndrName", "String"));
dataTmpltList.add(new DataExpTmplt(2, "noteToBnf", "String"));
dataTmpltList.add(new DataExpTmplt(3, "sndrPhone", "String"));
dataTmpltList.add(new DataExpTmplt(4, "entryUser", "String"));
dataTmpltList.add(new DataExpTmplt(5, "sndrAdd", "String"));
}
@After
public void tearDown() {
}
@Test
public void testGetWebList() {
assertFalse(webInOutList.isEmpty());
}
@Test
public void testCSVExport() throws IOException {
assertNotNull(DataExp.exportToCsv(webInOutList,dataTmpltList));
}
@Test
public void testXLSExport() throws IOException, SQLException, ClassNotFoundException {
try {
assertNotNull(DataExp.exportToXLS(webInOutList, dataTmpltList));
} catch (IllegalAccessException ex) {
System.out.println(ex);
} catch (InvocationTargetException ex) {
System.out.println(ex);
} catch (NoSuchMethodException ex) {
System.out.println(ex);
}
}
@Test
public void testXLSXExport() throws IOException, SQLException, ClassNotFoundException {
try {
assertNotNull(DataExp.exportToXLSX(webInOutList, dataTmpltList));
} catch (IllegalAccessException ex) {
System.out.println(ex);
} catch (InvocationTargetException ex) {
System.out.println(ex);
} catch (NoSuchMethodException ex) {
System.out.println(ex);
}
}
}
这是我的模板类
public class DataExpTmplt implements Serializable {
public static final long serialVersionUID = 1L;
private Integer coloumnIndex;
private String fieldName;
private String fieldType;
List<DataExpTmplt> importTemplate;
public List<DataExpTmplt> getImportTemplate() {
return importTemplate;
}
public void setImportTemplate(List<DataExpTmplt> importTemplate) {
this.importTemplate = importTemplate;
}
public DataExpTmplt(){
}
public DataExpTmplt(Integer cIndex,String fName,String fType){
this.coloumnIndex=cIndex;
this.fieldName=fName;
this.fieldType=fType;
}
public Integer getColoumnIndex() {
return coloumnIndex;
}
public Integer getPOIColumnIndex(){
int temp=coloumnIndex-1;
return temp;
}
public void setColoumnIndex(Integer coloumnIndex) {
this.coloumnIndex = coloumnIndex;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getFieldType() {
return fieldType;
}
public void setFieldType(String fieldType) {
this.fieldType = fieldType;
}
public DataExpTmplt getTypesAtColumnIndex(Integer colIndex){
if(importTemplate==null||importTemplate.isEmpty()){
return null;
}
for (DataExpTmplt currentTemplateVO : importTemplate) {
if(currentTemplateVO.getPOIColumnIndex().equals(colIndex)){
return currentTemplateVO;
}
}
return null;
}
}
期望输出
Abc AbcBnfaddr Abcphone AbcEntryUser AbcSndrAddr
Xyz XyzBnfaddr1 Xyzphone1 XyzEntryUSer1 XyzSndrAddr1
我希望输出应该像这样请帮我解决这个问题 感谢你提前..:
有人可以帮我解决这个问题或提供一些代码片段吗? 感谢
答案 0 :(得分:1)
我想我找到了它:
在测试中,您将相同的对象添加两次,导致在XLS中生成两次相同的行。当您第二次调用setter时,您也会更改已传递到列表中的对象的值。看我的更正:
@BeforeClass
public static void setUpClass() {
WebInOutTrx temp=new WebInOutTrx();
temp.setSndrName("Abc");
temp.setNoteToBnf("Abc Bnf addr");
temp.setSndrPhone("Abc phone");
temp.setEntryUser("Abc Entry USer");
temp.setSndrAdd("Abc Sndr Addr");
webInOutList.add(temp);
//Missing in your code
WebInOutTrx temp=new WebInOutTrx();
//End Missing
temp.setSndrName("Abc");
temp.setNoteToBnf("Abc Bnf addr1");
temp.setSndrPhone("Abc phone1");
temp.setEntryUser("Abc Entry USer1");
temp.setSndrAdd("Abc Sndr Addr1");
webInOutList.add(temp);
}
实际上,这应该创建两个不同的测试行。如果你想匹配问题中给出的所需输出(我重新格式化了一下),你需要改为:
@BeforeClass
public static void setUpClass() {
WebInOutTrx temp=new WebInOutTrx();
temp.setSndrName("Abc");
temp.setNoteToBnf("Abc Bnf addr");
temp.setSndrPhone("Abc phone");
temp.setEntryUser("Abc Entry USer");
temp.setSndrAdd("Abc Sndr Addr");
webInOutList.add(temp);
//Missing in your code
WebInOutTrx temp=new WebInOutTrx();
//End Missing
temp.setSndrName("Xyz ");
temp.setNoteToBnf("Xyz Bnf addr1");
temp.setSndrPhone("Xyz phone1");
temp.setEntryUser("Xyz Entry USer1");
temp.setSndrAdd("Xyz Sndr Addr1");
webInOutList.add(temp);
}
关于列/行计数器
// int columnFlag=0; //too early here
while (rowFlag != rowCount) {
Row row = sheet.createRow(rowFlag);
int columnFlag=0; //here it belongs - reset columns for every row
Iterator<WebInOutTrx> it = givenList.iterator();
while (columnFlag != columnCount) {
String fieldName = dataTmpltList.get(columnFlag).getFieldName();