Создание и редактирование документов Excel (.csv) с Java - PullRequest
1 голос
/ 28 июня 2010

Для этого проекта, над которым я работаю, я хочу взять несколько листов Excel, а затем объединить их в один, манипулируя данными, чтобы сделать все немного более читабельным.

Как лучше всего открыть файлы, прочитать их содержимое, сохранить их, создать новый файл (.csv), а затем вставить информацию в организацию по моему выбору?

Мне определенно нужно придерживаться Java, так как это будет частью уже существующего автоматизированного процесса, и я не хочу менять все на другой язык.

Есть ли полезный пакет, о котором я должен знать?

Большое спасибо

Жюстьян

Ответы [ 5 ]

2 голосов
/ 28 июня 2010

Я думаю, что любая серьезная работа в Excel должна учитывать Решение Джоэла , позволяющее Office делать это за вас на компьютере с Windows, который вы вызываете удаленно, если это необходимо. Если, однако, ваши потребности достаточно просты или вам действительно нужно решение на чистом Java, библиотека Apache POI достаточно хорошо справляется.

1 голос
/ 28 июня 2010

Насколько я знаю, csv не специфичен для Excel, а представляет собой файл с разделителями-запятыми".

Так что это может вам помочь.

0 голосов
/ 09 июля 2019

Попробуйте этот код

    import java.util.*;
    import java.util.Map.Entry;
    import java.util.concurrent.TimeoutException;
    import java.util.logging.Logger;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;

    public class App {

        public void convertExcelToCSV(Sheet sheet, String sheetName) {
            StringBuffer data = new StringBuffer();
            try {
                FileOutputStream fos = new FileOutputStream("C:\\Users\\" + sheetName + ".csv");
                Cell cell;
                Row row;

                Iterator<Row> rowIterator = sheet.iterator();
                while (rowIterator.hasNext()) {
                    row = rowIterator.next();
                    Iterator<Cell> cellIterator = row.cellIterator();
                    while (cellIterator.hasNext()) {
                        cell = cellIterator.next();

                        CellType type = cell.getCellTypeEnum();
                        if (type == CellType.BOOLEAN) {
                            data.append(cell.getBooleanCellValue() + ",");
                        } else if (type == CellType.NUMERIC) {
                            data.append(cell.getNumericCellValue() + ",");
                        } else if (type == CellType.STRING) {
                            data.append(cell.getStringCellValue() + ",");
                        } else if (type == CellType.BLANK) {
                            data.append("" + ",");
                        } else {
                            data.append(cell + ",");
                        }
                    }
                    data.append('\n');
                }
                fos.write(data.toString().getBytes());
                fos.close();
            }
            catch (FileNotFoundException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        public static void main(String [] args)
        {
            App app = new App();
            String path =  "C:\\Users\\myFile.xlsx";
            InputStream inp = null;
            try {
                inp = new FileInputStream(path);
                Workbook wb = WorkbookFactory.create(inp);

                for(int i=0;i<wb.getNumberOfSheets();i++) {
                    System.out.println(wb.getSheetAt(i).getSheetName());
                    app.convertExcelToCSV(wb.getSheetAt(i),wb.getSheetAt(i).getSheetName());
                }
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            } 
            finally {
                try {
                    inp.close();
                } catch (Exception ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
    }
0 голосов
/ 29 июня 2010

Может быть, вам стоит попробовать это: Jxcell , это компонент электронной таблицы Java, который может читать / писать / редактировать все файлы xls / xlsx / csv.

0 голосов
/ 28 июня 2010

Написание CSV-файлов обычно очень просто по понятным причинам.Вы можете написать свой собственный вспомогательный класс для этого.Предостережение заключается в том, чтобы у вас не было разделителя в выходах.

Чтение CSV сложнее.Не существует стандартной библиотеки, как в Python (гораздо лучший язык, IMHO, для обработки CSV), но если вы ищете ее, есть много приличных бесплатных реализаций.

Самый большойВопрос - это внутреннее представление вашей программы: в зависимости от размера ваших входов и выходов, хранение всего в памяти может быть исключено.Вы можете сделать все за один проход?(Я имею в виду, читать некоторые, писать некоторые и т. Д.)

Вы также можете использовать разреженные представления, а не просто представлять все электронные таблицы в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...