如何使用Apache POI HSSFWorkbook转换为XSSFWorkbook

 我来答
龙氏风采
2017-11-17 · 知道合伙人互联网行家
龙氏风采
知道合伙人互联网行家
采纳数:5849 获赞数:12817
从事互联网运营推广,5年以上互联网运营推广经验,丰富的实战经

向TA提问 私信TA
展开全部
公共final类ExcelDocumentConverter {
公共静态XSSFWorkbook convertWorkbookHSSFToXSSF(HSSFWorkbook源){
XSSFWorkbook retVal的=新XSSFWorkbook();
的for(int i = 0; I< source.getNumberOfSheets();我++){
XSSFSheet xssfSheet = retVal.createSheet();
HSSFSheet hssfsheet = source.getSheetAt(ⅰ);
copySheets(hssfsheet,xssfSheet);
}
返回retVal的;
}公共静态无效copySheets(HSSFSheet源,XSSFSheet目的地){
copySheets(源,目标,真正的);
}/ **
* @参数目的地
*本表从副本中创建。
* @参数的
*板材进行复制。
* @参数copyStyle
*副本的风格。
* /
公共静态无效copySheets(HSSFSheet源,XSSFSheet目的地,布尔copyStyle){
INT maxColumnNum = 0;
地图<整数,HSSFCellStyle>在StyleMap =(copyStyle)?新的HashMap<整数,HSSFCellStyle>():空;
对于(INT I = source.getFirstRowNum(); I< = source.getLastRowNum();我++){
HSSFRow srcRow = source.getRow(ⅰ);
XSSFRow destRow = destination.createRow(ⅰ);
如果(srcRow!= NULL){
copyRow(源,目标,srcRow,destRow,在StyleMap);
如果(srcRow.getLastCellNum()> maxColumnNum){
maxColumnNum = srcRow.getLastCellNum();
}
}
}
的for(int i = 0; I< = maxColumnNum;我++){
destination.setColumnWidth(ⅰ,source.getColumnWidth(ⅰ));
}
}/ **
* @参数srcSheet
*本表进行复制。
* @参数destSheet
*本表创建。
* @参数srcRow
*行复制。
* @参数destRow
*行创建。
* @参数在StyleMap
* -
* /
公共静态无效copyRow(HSSFSheet srcSheet,XSSFSheet destSheet,HSSFRow srcRow,XSSFRow destRow,
地图<整数,HSSFCellStyle>在StyleMap){
为了不插入两个次//管理合并区列表
//合并区
SET< CellRangeAddressWrapper> mergedRegions =新TreeSet的< CellRangeAddressWrapper>();
destRow.setHeight(srcRow.getHeight());
//倒排chaque
对于(INT J = srcRow.getFirstCellNum(); J< = srcRow.getLastCellNum(); J ++){
HSSFCell oldCell = srcRow.getCell(J); //安西安娜细胞
XSSFCell newCell = destRow.getCell(J); //新细胞
如果(oldCell!= NULL){
如果(newCell == NULL){
newCell = destRow.createCell(J);
}
//复制chaque细胞
copyCell(oldCell,newCell,在StyleMap);
//复制莱斯信息融合德莱恩特雷里奥斯cellules
//的System.out.println(“行号:”+ srcRow.getRowNum()+
//“,西:”+(短)oldCell.getColumnIndex());
的CellRangeAddress mergedRegion = getMergedRegion(srcSheet,srcRow.getRowNum()
(短)oldCell.getColumnIndex()); 如果(mergedRegion!= NULL){
//的System.out.println(“选定合并后的区域:”+
// mergedRegion.toString());
的CellRangeAddress newMergedRegion =新的CellRangeAddress(mergedRegion.getFirstRow()
mergedRegion.getLastRow(),mergedRegion.getFirstColumn(),mergedRegion.getLastColumn());
//的System.out.println(“新合并的区域:”+
// newMergedRegion.toString());
CellRangeAddressWrapper包装=新CellRangeAddressWrapper(newMergedRegion);
如果(isNewMergedRegion(包装,mergedRegions)){
mergedRegions.add(包装);
destSheet.addMergedRegion(wrapper.range);
}
}
}
}}/ **
* @参数oldCell
* @参数newCell
* @参数在StyleMap
* /
公共静态无效copyCell(HSSFCell oldCell,XSSFCell newCell,地图<整数,HSSFCellStyle>在StyleMap){
如果(在StyleMap!= NULL){
。INT stHash code = oldCell.getCellStyle()哈希code();
HSSFCellStyle sourceCellStyle = styleMap.get(stHash code);
XSSFCellStyle destnCellStyle = newCell.getCellStyle();
如果(sourceCellStyle == NULL){
sourceCellStyle = oldCell.getSheet()getWorkbook()createCellStyle()。
}
destnCellStyle.cloneStyleFrom(oldCell.getCellStyle());
styleMap.put(stHash code,sourceCellStyle);
newCell.setCellStyle(destnCellStyle);
}
开关(oldCell.getCellType()){
案例HSSFCell.CELL_TYPE_STRING:
newCell.setCellValue(oldCell.getStringCellValue());
打破;
案例HSSFCell.CELL_TYPE_NUMERIC:
newCell.setCellValue(oldCell.getNumericCellValue());
打破;
案例HSSFCell.CELL_TYPE_BLANK:
newCell.setCellType(HSSFCell.CELL_TYPE_BLANK);
打破;
案例HSSFCell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(oldCell.getBooleanCellValue());
打破;
案例HSSFCell.CELL_TYPE_ERROR:
newCell.setCellErrorValue(oldCell.getErrorCellValue());
打破;
案例HSSFCell.CELL_TYPE_FORMULA:
newCell.setCellFormula(oldCell.getCellFormula());
打破;
默认:
打破;
}}/ **
*Récupère莱斯信息融合德宫cellules丹斯拉片源
*倒莱appliquer点菜片目的地......Récupère所有领域
*合并丹斯拉片源等regarde倒chacune D'ELLE ELLE SI本身
* trouve丹斯LA当前行阙常识traitons。 SI OUI,retourne L'客体
*的CellRangeAddress。
*
* @参数表
*包含数据的片。
* @参数的rowNum
*行的NUM进行复制。
* @参数cellNum
*单元的NUM复制。
返回:创建的CellRangeAddress。
* /
公共静态的CellRangeAddress getMergedRegion(HSSFSheet片,诠释的rowNum,短cellNum){
的for(int i = 0; I< sheet.getNumMergedRegions();我++){
的CellRangeAddress合并= sheet.getMergedRegion(ⅰ);
如果(merged.isInRange(的rowNum,cellNum)){
返回合并;
}
}
返回null;
}/ **
*检查合并后的地区已在目标表中创建。
*
* @参数newMergedRegion
*合并后的区域到目标表复制或没有。
* @参数mergedRegions
*包含所有合并的地区名单。
*如果合并的区域是已在列表或不@返回真。
* /
私有静态布尔isNewMergedRegion(CellRangeAddressWrapper newMergedRegion,
SET< CellRangeAddressWrapper> mergedRegions){
!返回mergedRegions.contains(newMergedRegion);
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式