Конвертировать .csv в .xls в Java - PullRequest
10 голосов
/ 06 июля 2010

Кто-нибудь здесь знает о каком-либо быстром, чистом способе преобразования файлов CSV в файлы Java или XLSX в Java?

У меня есть кое-что для управления файлами CSV уже на месте, и мне нужна дополнительная совместимость для других программ,

Пример кода в дополнение к именам пакетов всегда приветствуется.

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

Justian

Вот мой код до сих пор.Мне нужно удалить возврат ("\ n") из строк.Некоторые из моих ячеек содержат несколько строк информации (список), поэтому я могу использовать «\ n» в csv для обозначения нескольких строк в ячейке , но xls обрабатывает их так, как если бы я хотел поместить их вновая строка .

Код изменен из Интернета и немного запутан на данный момент.Вы можете заметить некоторые устаревшие методы, как они были написаны в 2004 году, и обязательно игнорировать ужасные операторы return.Сейчас я просто использую Sop для тестирования, а потом исправлю.

package jab.jm.io;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class FileConverter {

    public static String ConvertCSVToXLS(String file) throws IOException {

        if (file.indexOf(".csv") < 0)
            return "Error converting file: .csv file not given.";

        String name = FileManager.getFileNameFromPath(file, false);
        ArrayList<ArrayList<String>> arList = new ArrayList<ArrayList<String>>();
        ArrayList<String> al = null;

        String thisLine;
        DataInputStream myInput = new DataInputStream(new FileInputStream(file));

        while ((thisLine = myInput.readLine()) != null) {
            al = new ArrayList<String>();
            String strar[] = thisLine.split(",");

            for (int j = 0; j < strar.length; j++) {
                // My Attempt (BELOW)
                String edit = strar[j].replace('\n', ' ');
                al.add(edit);
            }

            arList.add(al);
            System.out.println();
        }

        try {
            HSSFWorkbook hwb = new HSSFWorkbook();
            HSSFSheet sheet = hwb.createSheet("new sheet");

            for (int k = 0; k < arList.size(); k++) {
                ArrayList<String> ardata = (ArrayList<String>) arList.get(k);
                HSSFRow row = sheet.createRow((short) 0 + k);

                for (int p = 0; p < ardata.size(); p++) {
                    System.out.print(ardata.get(p));
                    HSSFCell cell = row.createCell((short) p);
                    cell.setCellValue(ardata.get(p).toString());
                }
            }

            FileOutputStream fileOut = new FileOutputStream(
                    FileManager.getCleanPath() + "/converted files/" + name
                            + ".xls");
            hwb.write(fileOut);
            fileOut.close();

            System.out.println(name + ".xls has been generated");
        } catch (Exception ex) {
        }

        return "";
    }
}

Ответы [ 6 ]

7 голосов
/ 06 июля 2010

Не знаю, знаете ли вы это уже, но:

  • Excel (если это ваша реальная цель) легко может читать .csv файлы напрямую, поэтому любое преобразование, которое вы сделаете, будет вежливым только для ваших менее одаренных пользователей.
  • CSV - это формат с наименьшим общим знаменателем. Маловероятно, что какой-либо конвертер добавит информацию к найденному в файле .csv, что сделает его более полезным. Другими словами, CSV - это «тупой» формат, и преобразование его в .xls (вероятно) увеличит размер файла, но не сделает формат более умным.

Предложение Кертиса о POI - это первое, что пришло мне в голову.

Если вы выполняете это преобразование на компьютере с Windows, другой альтернативой может быть Jacob , мост Java-COM, который позволит вам эффективно удаленно управлять Excel из программы Java, чтобы делать вещи например, открыть файл и сохранить в другом формате, возможно, даже применив некоторые изменения форматирования или что-то подобное.

Наконец, у меня также был некоторый успех в выполнении SQL INSERT s (через JDBC) на листе Excel, доступ к которому осуществляется через мост JDBC-ODBC. то есть ODBC может сделать файл Excel похожим на базу данных. Это не очень гибко, но вы не можете попросить БД создать файлы с произвольным именем .XLS.


EDIT:

Мне кажется, что readLine() уже не дает вам целых строк. Как узнать, что возврат каретки не является ограничителем строки? Вы сможете проверить это с помощью отладочных операторов печати сразу после readLine ().

Если это действительно так, это будет отстой, потому что путь вперед будет для вас

  • либо распознать неполные строки и вставить их после факта,
  • или напишите свою собственную замену readLine (). Простой подход состоит в том, чтобы читать символ за символом, заменяя символы CR внутри строки CSV и накапливая текст в StringBuilder, пока не почувствуете, что у вас есть полная строка.

Обе альтернативы - это работа, которую вы, вероятно, не ожидали.

6 голосов
/ 22 июля 2014

Скопируйте и вставьте нижеприведенную программу, я запустил программу, и она работает нормально. Дайте мне знать, если у вас есть какие-либо вопросы по поводу этой программы. (Вам нужен Apache POI Jar для запуска этой программы)

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;


public class CSVToExcelConverter {

    public static void main(String args[]) throws IOException
    {
        ArrayList arList=null;
        ArrayList al=null;
        String fName = "test.csv";
        String thisLine;
        int count=0;
        FileInputStream fis = new FileInputStream(fName);
        DataInputStream myInput = new DataInputStream(fis);
        int i=0;
        arList = new ArrayList();
        while ((thisLine = myInput.readLine()) != null)
        {
            al = new ArrayList();
            String strar[] = thisLine.split(",");
            for(int j=0;j<strar.length;j++)
            {
                al.add(strar[j]);
            }
            arList.add(al);
            System.out.println();
            i++;
        }

        try
        {
            HSSFWorkbook hwb = new HSSFWorkbook();
            HSSFSheet sheet = hwb.createSheet("new sheet");
            for(int k=0;k<arList.size();k++)
            {
                ArrayList ardata = (ArrayList)arList.get(k);
                HSSFRow row = sheet.createRow((short) 0+k);
                for(int p=0;p<ardata.size();p++)
                {
                    HSSFCell cell = row.createCell((short) p);
                    String data = ardata.get(p).toString();
                    if(data.startsWith("=")){
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        data=data.replaceAll("\"", "");
                        data=data.replaceAll("=", "");
                        cell.setCellValue(data);
                    }else if(data.startsWith("\"")){
                        data=data.replaceAll("\"", "");
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        cell.setCellValue(data);
                    }else{
                        data=data.replaceAll("\"", "");
                        cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                        cell.setCellValue(data);
                    }
                    //*/
                    // cell.setCellValue(ardata.get(p).toString());
                }
                System.out.println();
            }
            FileOutputStream fileOut = new FileOutputStream("test.xls");
            hwb.write(fileOut);
            fileOut.close();
            System.out.println("Your excel file has been generated");
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } //main method ends
    }
}
5 голосов
/ 06 июля 2010

Если вы хотите читать или записывать файлы XLS или XLSX на Java, рекомендуется использовать Apache POI: http://poi.apache.org/

1 голос
/ 11 июня 2013

Инструменты в Excel не подходят для того, что хочет сделать ОП.Он там на правильном пути.Excel не может импортировать несколько файлов CSV в разные таблицы в одном и том же файле, поэтому вы захотите сделать это в коде.Я предлагаю использовать OpenCSV для чтения CSV, так как он может автоматически исправлять новые строки в данных и пропущенных столбцах, и это бесплатный и открытый исходный код.Это на самом деле очень, очень надежный и может обрабатывать все виды различных нестандартных файлов CSV.

0 голосов
/ 11 июля 2014

Я создал небольшое программное обеспечение под названием csv2xls .Нужна Java.

0 голосов
/ 06 июля 2010

Вы писали:

У меня есть кое-что для управления csv-файлами, и мне нужна дополнительная совместимость для других программ.

Что это за другие программы?Требуется ли им доступ к вашим данным через файлы Excel или они могут работать с подключением JDBC или ODBC к базе данных?Используя базу данных в качестве центрального расположения, вы можете извлекать данные в CSV-файлы или другие форматы по мере необходимости.

...