用POI生成EXCEL文件的技巧与心得

来源:互联网 发布:2017 淘宝 大麻 编辑:程序博客网 时间:2024/05/17 09:20
用POI创建EXCEL文件:
第一步:创建一个HSSFWorkbook: HSSFWorkbook workbook = new HSSFWorkbook();
第二步: 创建EXCEL sheet:      HSSFSheet sheet = workbook.createSheet("sheetname");
第三步:创建行:               HSSFRow row = sheet.creatRow(rowIndex) // rowIndex is short int >= 0
第四步:创建单元格:           HSSFCell cell = row.creaCell(cellIndex) //cellIndex is short int >= 0
第五步:打开一个文件输出流:  FileOutputStream out = new FileOutPutStream("FilePath.xls");
第六步:写文件:               wb.write(out); out.close();


初始化一列数据:
for(int i = 0; i < rowNum; i++){
   HSSFRow row = sheet.getRow(i);
   if(row == null){
    row = sheet.createRow(i);
   }
   HSSFCell cell = row.getCell(i);
   if(cell == null){
    cell = row.createCell(i);
   }
   cell.setCellValue(cellValue);
}


初始化sheet标题:
String[] titles = {"标题1","标题2","标题3","标题4","标题5","标题6"};
HSSFRow row = sheet.createRow((short)0);
HSSFCell cell = null;
for(int i = 0; i < titles.length; i++){
    cell = row.createCell(i);
    cell.setCellValue(titles[i]);
}


添加数据有效性:


方法一
// validata组成数据有效性的字符串
// firstRow 起始行
// lastRow 结束行
// firstCol 起始列
// lastCol 结束列
public static HSSFDataValidation setDataValidationList(String validata, int firstRow,int lastRow, int firstCol,int lastCol){
     //for example  validata = "a,b,c,d";
     //加载下拉列表内容
     
     DVConstraint constraint=DVConstraint.createExplicitListConstraint(validata.split("\\,"));
     
     //数据有效性的区域
     CellRangeAddressList regions = new CellRangeAddressList(firstRow,lastRow,firstCol,lastCol);
     
     //数据有效性对象
     HSSFDataValidataion data_validation_list = new HSSFDataValidation(regions,constraint);
     
     return data_validation;
}
HSSFDataValidation  dataValidation = setDataValidationList(validata,0,1000,3,3);
sheet.addValidationData(dataValidation);


方法一的不足之处:
数据有效性选项的长度会受到限制,好像是不能超过256个字。


因此出现了方法二


思路:新建一个隐藏的sheet,把数据有效性的选项放到该sheet的某一列中。然后在数据有效性原来所在的sheet中建立
一个映射。把数据有项性映射到隐藏sheet的某一列


HSSFSheet sheet = wb.creatSheet("hidden");
String[] validDatas = {"a","b","c","d","e"};
HSSFRow row = null;
HSSFCell cell = null;
for(int i = 0; i < validDatas.length; i++){
   row = sheet.createRow(i);
   cell = row.ceateCell(i);
   cell.setCellValue(valiDatas[i]);
}
 //1 代表hidden的索引 第一个 sheet的索引为0,第二个为1,依次类推
      wb.setSheetHidden(1, true);
      
      // 这一段我自己把它理解为建立一个名为myhidden的映射,不知道对不对
      // 因为没有API,我是平自己的理解
      Name namedCell = wb.createName(); 
   namedCell.setNameName("myhidden");
  
  //映射到hidden某一列
   namedCell.setRefersToFormula("hidden!$A$1:$A$"+validatas.length); 
   
   //后面就一样了
   DVConstraint constraint = DVConstraint.createFormulaListConstraint("myhidden");
   CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, 3, 3); 
   HSSFDataValidation validation = new HSSFDataValidation(addressList, constraint); 
  
  
  //获取Excel文件中sheet的数量
   int numbers= wb.getNumberOfSheets();


这些都是我自己在做项目的时候总结出来的一些技巧,希望对大家有用。因为是手打,难免会有错漏,如果有什么不对的地方,大家不要见怪。
ps:我用的POI是3.9的
原创粉丝点击