2010-07-06 9 views
8

Кто-нибудь знает, какой быстрый, чистый способ конвертировать CSV-файлы в xls или xlsx-файлы в java?Преобразование .csv в .xls в Java

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

Образец кода в дополнение к названиям пакетов всегда хорошо оценивается.

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

Жюстьян

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

Код изменен из Интернета и немного запутанный на данный момент. Вы можете заметить некоторые устаревшие методы, как это было написано в 2004 году, и не забудьте проигнорировать ужасные заявления о возврате. Я просто использую S.o.p на данный момент для тестирования, и я уберу это позже.

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 ""; 
    } 
} 
+0

Update в моем ответе. Извините, вам пришлось немного подождать. –

ответ

6

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

  • 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, пока вы не почувствуете, что у вас есть полная строка.

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

+0

Ну, я использую данные, вытащенные с веб-сайта (который я не контролирую), и они экспортируют эти данные в формате csv. К сожалению, некоторые программы, которые я хотел бы использовать с данными, требуют файлов xls. Да, это бессмысленно для «up-convert», но это проблема с программным обеспечением, которое я должен использовать. Я пытался POI с некоторым успехом, но, похоже, ненавижу символы возврата (\ n), которые я смог использовать в CSV (понятно, потому что запятые являются разделителями). Я отправлю свой код выше. Любая идея, как удалить символы? Я помету свою попытку выше. –

+0

@Justian: Снимая код, я не смог выяснить, какую проблему вы пытаетесь решить. Являются ли эти CR в середине полей или в конце записей? Если они находятся в полях, их следует заменить, скажем, одним пробелом? Ваш код не преуспевает в этом? –

+0

Нет, это не так. Предположим, что у меня есть поля для имени | домашние животные | почтовый индекс. Если у меня есть многострочный столбец в csv, например «john | dog (\ n) cat | 10000», он будет отображаться как «john | dog» и (next row) «cat | zip». Трудно показать это с автоматическим форматированием stackoverflow. Из того, что я вижу, он должен * исправить это, но пока не повезло. –

5

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

0

Вы писали:

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

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

+0

В этом случае соединение JDBC или ODBC не будет работать. –

0

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

0

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

+0

Ссылка не работает. – Jaan

+0

Спасибо @Jaan. Теперь это [здесь] (https://github.com/sixro/incubateur/tree/master/csv2xls). – sixro

3

Скопируйте и вставьте ниже программу, я запустил программу, и она работает нормально, дайте мне знать, если у вас есть какие-либо проблемы по этой программе. (Вам нужно 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 
    } 
} 
Смежные вопросы