Solution using Poi conversion tool implementation issues.
Problem to be solved: When xls file corruption or other factors that may cause the file can not be properly read. After the Internet to find various solutions are ineffective.
1 package com.excel.util; 2 3 4 5 import org.apache.poi.hssf.usermodel.*; 6 import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 7 import org.apache.poi.poifs.filesystem.POIFSFileSystem; 8 import org.apache.poi.ss.usermodel.*; 9 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 10 11 12 import java.io.*; 13 import java.text.SimpleDateFormat; 14 import java.util.Iterator; 15 16 public class Tests { . 17 / ** time format * / 18 is Private static Final String OUTPUT_DATE_FORMAT = "YYYY / the MM / dd" ; . 19 / ** Cvs of delimiter * / 20 is Private static Final String CVS_SEPERATOR_CHAR = "," ; 21 is / ** new line * / 22 is Private static Final String NEW_LINE_CHARACTER = "\ R & lt \ n-" ; 23 is 24 / ** 25 * rotation Xlsx 26 is * @param Source 27 * @param dest 28 * @throws InvalidFormatException 29 * @throws IOException 30 */ 31 public static void transXlsx (String source,String dest) throws InvalidFormatException, 32 IOException { 33 // String inpFnc = source;; 34 // String csv = source.replace(".xls",".csv"); 35 String inpFn = source; //transCsv(source,csv); 36 String outFn = dest; 37 InputStream in = new BufferedInputStream(new FileInputStream(inpFn)); 38 try { 39 Workbook wbIn = new HSSFWorkbook(in); 40 File outF = new File(outFn); 41 if (outF.exists()) { 42 outF.delete(); 43 } 44 45 Workbook wbOut = new XSSFWorkbook(); 46 int sheetCnt = wbIn.getNumberOfSheets(); 47 for (int i = 0; i < sheetCnt; i++) { 48 Sheet sIn = wbIn.getSheetAt(0); 49 Sheet sOut = wbOut.createSheet(sIn.getSheetName()); 50 Iterator<Row> rowIt = sIn.rowIterator(); 51 while (rowIt.hasNext()) { 52 Row rowIn = rowIt.next(); 53 Row rowOut = sOut.createRow(rowIn.getRowNum()); 54 55 Iterator<Cell> cellIt = rowIn.cellIterator(); 56 while (cellIt.hasNext()) { 57 Cell cellIn = cellIt.next(); 58 Cell cellOut = rowOut.createCell( 59 cellIn.getColumnIndex(), cellIn.getCellType()); 60 61 if (cellIn.getCellType() == CellType.BLANK ) { 62 } 63 64 65 else if (cellIn.getCellType() == CellType.BOOLEAN ) { 66 cellOut.setCellValue(cellIn.getBooleanCellValue()); 67 } 68 69 else if(cellIn.getCellType () == CellType.ERROR) { 70 cellOut.setCellValue (cellIn.getErrorCellValue ()); 71 } 72 73 else if (cellIn.getCellType () == CellType.FORMULA) { 74 cellOut.setCellFormula (cellIn.getCellFormula ()); 75 } 76 77 if (cellIn.getCellType () == CellType.NUMERIC) { 78 if (DateUtil.isCellDateFormatted (cellIn)) { 79 cellOut.setCellValue ( New SimpleDateFormat(OUTPUT_DATE_FORMAT).format(cellIn.getDateCellValue())); 80 } 81 cellOut.setCellValue(cellIn.getNumericCellValue()); 82 } 83 84 if (cellIn.getCellType() == CellType.STRING){ 85 cellOut.setCellValue(cellIn.getStringCellValue()); 86 } 87 88 { 89 CellStyle styleIn = cellIn.getCellStyle(); 90 CellStyle styleOut = cellOut.getCellStyle(); 91 styleOut.setDataFormat(styleIn.getDataFormat()); 92 } 93 cellOut.setCellComment(cellIn.getCellComment()); 94 95 // HSSFCellStyle cannot be cast to XSSFCellStyle 96 // cellOut.setCellStyle(cellIn.getCellStyle()); 97 } 98 } 99 } 100 OutputStream out = new BufferedOutputStream(new FileOutputStream(outF)); 101 try { 102 wbOut.write(out); 103 } finally { 104 out.close(); 105 } 106 } finally { 107 in.close(); 108 } 109 } 110 111 /** 112 * 转Csv 113 * @param fileName 114 * @param csvFileName 115 * @return 116 * @throws IOException 117 */ 118 private static String transCsv(String fileName,String csvFileName) throws IOException { 119 String excelFileName = fileName; 120 HSSFWorkbook myWorkBook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(excelFileName))); 121 HSSFSheet mySheet = myWorkBook.getSheetAt(0); 122 Iterator rowIter = mySheet.rowIterator(); 123 String csvData = ""; 124 while (rowIter.hasNext()) { 125 HSSFRow myRow = (HSSFRow) rowIter.next(); 126 for (int i = 0; i < myRow.getLastCellNum(); i++) { 127 csvData += getCellData(myRow.getCell(i)); 128 } 129 csvData += NEW_LINE_CHARACTER; 130 } 131 132 FileOutputStream writer = new FileOutputStream(csvFileName); 133 writer.write(csvData.getBytes()); 134 writer.close(); 135 return csvFileName; 136 } 137 138 private static String getCellData (HSSFCell myCell) { 139 String cell data = "" ; 140 if (myCell == null ) { 141 cell data + = CVS_SEPERATOR_CHAR; 142 } 143 144 145 else if (myCell.getCellType () == CellType.BOOLEAN) { 146 cell data myCell.getBooleanCellValue = + () + CVS_SEPERATOR_CHAR; 147 } 148 149 else if (myCell.getCellType () == CellType.ERROR) { 150 cell data myCell.getErrorCellValue = + () + CVS_SEPERATOR_CHAR; 151 } 152 153 else if (myCell.getCellType () == CellType.FORMULA) { 154 cell data myCell.getCellFormula = + () + CVS_SEPERATOR_CHAR; 155 } 156 157 158 else if (myCell.getCellType () == CellType.NUMERIC) { 159 if (DateUtil.isCellDateFormatted (myCell)) { 160 cell data + = new Simple Dateformat (OUTPUT_DATE_FORMAT) .format (myCell.getDateCellValue ()) +CVS_SEPERATOR_CHAR; 161 } else { 162 cell data myCell.getNumericCellValue = + () + CVS_SEPERATOR_CHAR; 163 } 164 } 165 166 else if (myCell.getCellType () == CellType.STRING) { 167 cell data myCell.getStringCellValue = + () + CVS_SEPERATOR_CHAR; 168 } 169 else { 170 cell data + = CVS_SEPERATOR_CHAR ;; 171 } 172 return cellData; 173 } 174 175 176 public static void main(String[] args) throws IOException, InvalidFormatException { 177 transXlsx("D:\\work\\aaa\\test.xls","D:\\work\\aaa\\test.xlsx"); 178 } 179 }