Мне нужно преобразовать csv в xls/xlsx в моем проекте? Как я могу это сделать? Может ли кто-нибудь отправить мне несколько примеров? Я хочу сделать это с помощью Apache poi. Мне также нужно создать ячейку со стороны Java.
Преобразовать csv в xls/xlsx с помощью Apache poi?
Ответы (5)
Вы можете попробовать следующий метод для создания файла xlsx с помощью apache-poi.
public static void csvToXLSX() {
try {
String csvFileAddress = "test.csv"; //csv file address
String xlsxFileAddress = "test.xlsx"; //xlsx file address
XSSFWorkbook workBook = new XSSFWorkbook();
XSSFSheet sheet = workBook.createSheet("sheet1");
String currentLine=null;
int RowNum=0;
BufferedReader br = new BufferedReader(new FileReader(csvFileAddress));
while ((currentLine = br.readLine()) != null) {
String str[] = currentLine.split(",");
RowNum++;
XSSFRow currentRow=sheet.createRow(RowNum);
for(int i=0;i<str.length;i++){
currentRow.createCell(i).setCellValue(str[i]);
}
}
FileOutputStream fileOutputStream = new FileOutputStream(xlsxFileAddress);
workBook.write(fileOutputStream);
fileOutputStream.close();
System.out.println("Done");
} catch (Exception ex) {
System.out.println(ex.getMessage()+"Exception in try");
}
}
person
Sankumarsingh
schedule
06.08.2013
спасибо, но мой csv | ограниченный. когда я заменяю запятую на пипи, я получаю один символ на ячейку. что я должен делать??
- person v0ld3m0rt; 07.08.2013
Пожалуйста, подтвердите, что вы использовали просто | или \\|.
- person Sankumarsingh; 07.08.2013
понял, я использовал | только что означало логическое или, я должен был использовать \\|. спасибо
- person v0ld3m0rt; 08.08.2013
Это вызывает исключение в строке: XSSFWorkbook workBook = new XSSFWorkbook(); с сообщением NoClassDefFoundError.
- person Code Doggo; 26.04.2016
Вы должны следовать соглашениям об именах. Это означает
rowNum
вместо RowNum
. Кроме того, String[] str
предпочтительнее, чем String str[]
, см. JLS 7. .
- person MC Emperor; 16.09.2016
Я получил эту ошибку, тип org.apache.poi.POIXMLDocument не может быть разрешен. На него косвенно ссылаются из требуемого файла .class. Я использую apache poi - 3.15 (в путь также добавлены схемы ooxml и ooxml)
- person Morez; 06.01.2017
Дэну, Ронни и другим, кто столкнулся с этой проблемой: добавьте соответствующий импорт (ага!). И если вы не понимаете, что это значит, самое время прочитать Учебник по Java.
- person Stephen C; 11.06.2017
RowNum++ перед записью означает, что вы создаете текущую строку в строке 2, а не в строке 1 листа Excel. rowNum должен быть увеличен после того, как вы закончите заполнение строки
- person gdawgrancid; 14.11.2019
Не работает, когда значение имеет , например, значение csv равно 5 200,00.
- person wherby; 24.09.2020
Вы увеличиваете RowNum слишком рано, в результате чего первая строка имеет индекс «1» вместо «0».
- person beirtipol; 11.06.2021
Мы можем использовать SXSSF Jar, в котором мы можем проанализировать длинный файл, как показано ниже:
public static void main( String[] args ) {
try {
// String fName = args[ 0 ];
String csvFileAddress = "C:\\Users\\psingh\\Desktop\\test\\New folder\\GenericDealerReport - version6.txt"; //csv file address
String xlsxFileAddress = "C:\\Users\\psingh\\Desktop\\trial\\test3.xlsx"; //xlsx file address
SXSSFWorkbook workBook = new SXSSFWorkbook( 1000 );
org.apache.poi.ss.usermodel.Sheet sheet = workBook.createSheet( "sheet1" );
String currentLine = null;
int RowNum = -1;
BufferedReader br = new BufferedReader( new FileReader( csvFileAddress ) );
while ( ( currentLine = br.readLine() ) != null ) {
String str[] = currentLine.split( "\\|" );
RowNum++;
Row currentRow = sheet.createRow( RowNum );
for ( int i = 0; i < str.length; i++ ) {
currentRow.createCell( i )
.setCellValue( str[ i ] );
}
}
DateFormat df = new SimpleDateFormat( "yyyy-mm-dd-HHmmss" );
Date today = Calendar.getInstance()
.getTime();
String reportDate = df.format( today );
FileOutputStream fileOutputStream = new FileOutputStream( xlsxFileAddress );
workBook.write( fileOutputStream );
fileOutputStream.close();
//System.out.println( "Done" );
}
catch ( Exception ex ) {
System.out.println( ex.getMessage() + "Exception in try" );
}
}
person
sunderam
schedule
11.03.2014
Стоит отметить, что вы анализируете | разделенный CSV (который не используется по умолчанию). Кроме того, я бы предложил создать читателей, используя Try-with-resources.
- person Amit Goldstein; 06.05.2021
Я обнаружил, что SXSSFWorkbook
действительно быстрее, чем XSSFWorkbook
. Вот измененный код:
try {
String csvFileInput = "inputFile.csv";
String xlsxFileOutput ="outputFile.xls";
LOGGER.error(csvFileInput);
LOGGER.error( xlsxFileOutput);
SXSSFWorkbook workBook = new SXSSFWorkbook();
Sheet sheet = workBook.createSheet(transformBean.getOutputFileName());
String currentLine = null;
int RowNum = 0;
BufferedReader br = new BufferedReader(new FileReader(csvFileInput));
while ((currentLine = br.readLine()) != null) {
String str[] = currentLine.split(",");
RowNum++;
Row currentRow = sheet.createRow(RowNum);
for (int i = 0; i < str.length; i++) {
currentRow.createCell(i).setCellValue(str[i]);
}
}
FileOutputStream fileOutputStream = new FileOutputStream(xlsxFileOutput);
workBook.write(fileOutputStream);
fileOutputStream.close();
System.out.println("Done");
} catch (Exception ex) {
System.out.println(ex.getMessage() + "Found Exception");
}
person
Superb Saif
schedule
20.10.2016
Попробуйте это, если у вас есть общедоступный статический XSSFWorkbook потока ввода csvToXLSX(InputStream inputStream) throws IOException { XSSFWorkbook workBook = new XSSFWorkbook();
try(BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
Sheet sheet = workBook.createSheet("sheet1");
String currentLine=null;
int rowNum=0;
while ((currentLine = br.readLine()) != null) {
String[] str = currentLine.split(",");
rowNum++;
Row currentRow=sheet.createRow(rowNum);
for(int i=0;i<str.length;i++){
currentRow.createCell(i).setCellValue(str[i]);
}
}
log.info("CSV file converted to the workbook");
return workBook;
} catch (Exception ex) {
log.error("Exception while converting csv to xls {}",ex);
}finally {
if (Objects.nonNull(workBook)) {
workBook.close();
}
}
return workBook;
}
person
Ravi Wadje
schedule
03.11.2017
person
schedule
Это САМОЕ БЫСТРОЕ решение, и оно четко самодокументировано. В моих тестах это на 30% быстрее, чем решение выше от Superb Self.
- person asnyder; 07.06.2019