Convertir un fichier Excel en fichier CSV

Tagged:

Tout est dit dans le titre ... ça fait 10 fois que j'en ai besoin et que je refuse de bosser avec ces types de fichiers, mais là plus le choix ... il faut ...

Bref il existe une extention qui permet d'accéder au contenu de ce type de fichiers qui est faite par Apache et qui s'appelle HSSF-POI.

Personnellement j'ai fait une classe helper qui utilise cette bibliothèque et qui permet d'exporter le contenu des fichiers excel dans un repertoire que l'on précise ... On peut aisément étendre le concept et le faire plus capable de gérer n'importe quel type de CSV mais j'avais besoin de semi-colon separated files, et j'ai fait ça :

public class ExcelHelper {
 
	public static File[] convertToCSV(File xlsFile, File exportPath) throws HelperException {
		try {
			
			if (!xlsFile.exists()) {
				throw new FileNotFoundException(xlsFile.getAbsolutePath());
			}
			if (!exportPath.exists()) {
				exportPath.mkdirs();
			}
			if (!exportPath.isDirectory()) {
				throw new HelperException("Export path must be a directory ! ("+exportPath.getAbsolutePath()+")");
			}
			
			String filename = xlsFile.getAbsolutePath();
			POIFSFileSystem filesystem = new POIFSFileSystem(new FileInputStream(filename));
			HSSFWorkbook workbook = new HSSFWorkbook(filesystem);
			
			Collection files = new ArrayList();
			for (int sheetNumber = 0; sheetNumber < workbook.getNumberOfSheets(); sheetNumber++) {
				files.add(convertSheetToCSV(sheetNumber, exportPath, xlsFile, workbook));
			}
 
			
			return (File[])files.toArray(new File[files.size()]);
		} catch (Exception e) {
			throw new HelperException(e);
		}
 
	}
	
	public static File convertToCSV(File xlsFile, File exportPath, int sheetNumber) throws HelperException {
		try {
			
			if (!xlsFile.exists()) {
				throw new FileNotFoundException(xlsFile.getAbsolutePath());
			}
			if (!exportPath.exists()) {
				exportPath.mkdirs();
			}
			if (!exportPath.isDirectory()) {
				throw new HelperException("Export path must be a directory ! ("+exportPath.getAbsolutePath()+")");
			}
			
			String filename = xlsFile.getAbsolutePath();
			POIFSFileSystem filesystem = new POIFSFileSystem(new FileInputStream(filename));
			HSSFWorkbook workbook = new HSSFWorkbook(filesystem);
 
			return convertSheetToCSV(sheetNumber, exportPath, xlsFile, workbook);
 
		} catch (Exception e) {
			throw new HelperException(e);
		}
 
	}
 
	private static File convertSheetToCSV(int sheetNumber, File exportPath, File xlsFile, HSSFWorkbook workbook) throws Exception {
		File exportFile = new File(exportPath, xlsFile.getName() + '_' + sheetNumber + ".csv");
		StringBuffer content = new StringBuffer("");
		HSSFSheet sheet = workbook.getSheetAt(sheetNumber);
		for (int rowNumber = 0; rowNumber < sheet.getPhysicalNumberOfRows(); rowNumber++) {
			
			HSSFRow row = sheet.getRow(rowNumber);
			for (short cellNumber = 0; cellNumber < row.getPhysicalNumberOfCells(); cellNumber++) {
				
				HSSFCell cell = row.getCell(cellNumber);
				if (cell != null) {
					switch (cell.getCellType()) {
						case HSSFCell.CELL_TYPE_NUMERIC:
							content.append(DoubleHelper.format(cell.getNumericCellValue(), "#,##0.00####"));
							break;
						case HSSFCell.CELL_TYPE_STRING:
							content.append(cell.getStringCellValue());
							break;
						case HSSFCell.CELL_TYPE_BLANK:
							content.append("");
							break;
						case HSSFCell.CELL_TYPE_FORMULA:
							content.append(cell.getStringCellValue());
							break;
						default:
							content.append("** UNKNOWN TYPE **");
							break;
					}
					content.append(";");
				}
				
			}
			content.append("\n");
			
		}
		FileHelper.createContent(exportFile, content);
		
		return exportFile;
	}
}

Bon comment ça s'utilise ? tout simple :

		try {
			File xlsFile = new File("/tmp/test.xls");
			File exportPath = new File("/tmp/exportCSV/");
			File[] results = ExcelHelper.convertToCSV(xlsFile, exportPath);
			File sheet0 = ExcelHelper.convertToCSV(xlsFile, exportPath, 0);
		} catch (HelperException e) {
			e.printStackTrace();
		}

Et voili =) C'est pas parfait mais ça dépanne =)

Comments

Bonjour,

On a pas les definitions des classes DoubleHelper, FileHelper et HelperException...