2010-07-06 40 views
8

Có ai ở đây biết về bất kỳ cách nhanh chóng, sạch sẽ nào để chuyển đổi tệp csv thành tệp xls hoặc xlsx trong java không?Chuyển đổi .csv thành .xls trong Java

Tôi có điều gì đó để quản lý tệp csv đã có sẵn và tôi cần khả năng tương thích bổ sung cho các chương trình khác.

Mã mẫu ngoài tên gói luôn được đánh giá cao.

Rất cám ơn,

Justian

Dưới đây là mã của tôi cho đến nay. Tôi cần phải loại bỏ các lợi nhuận ("\ n") từ các dòng. Một số ô của tôi chứa nhiều dòng thông tin (danh sách), vì vậy tôi có thể sử dụng "\ n" trong csv để biểu thị nhiều dòng trong một ô , nhưng xls coi chúng như thể tôi muốn đặt chúng trên một dòng mới.

Mã được sửa đổi từ Internet và một chút lộn xộn vào lúc này. Bạn có thể nhận thấy một số phương pháp không được chấp nhận, vì nó được viết vào năm 2004 và chắc chắn bỏ qua các báo cáo trả về khủng khiếp. Tôi chỉ đang sử dụng S.o.p vào lúc này để kiểm tra và tôi sẽ dọn dẹp nó sau.

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

Cập nhật trong câu trả lời của tôi. Xin lỗi bạn đã phải chờ một chút. –

Trả lời

6

Không biết nếu bạn biết điều này đã có, nhưng:

  • Excel (nếu đó là mục tiêu thực sự của bạn) có thể dễ dàng đọc trực tiếp các tệp .csv, do đó, bất kỳ chuyển đổi nào bạn thực hiện sẽ chỉ là lịch sự đối với người dùng "có năng khiếu".
  • CSV là định dạng mẫu số chung thấp nhất. Không có bất kỳ trình chuyển đổi nào để thêm thông tin vào thông tin được tìm thấy trong tệp .csv sẽ làm cho tệp hữu ích hơn. Nói cách khác, CSV là định dạng "câm" và chuyển đổi thành .xls (có thể) sẽ tăng kích thước tệp nhưng không làm cho định dạng thông minh hơn.

Đề xuất của Curtis về POI là điều đầu tiên tôi cũng nghĩ đến.

Nếu bạn đang thực hiện chuyển đổi này trên máy Windows, một giải pháp thay thế khác có thể là Jacob, một cầu nối Java-COM cho phép bạn điều khiển từ xa Excel hiệu quả từ một chương trình Java để làm những việc như mở tệp lưu ở định dạng khác, thậm chí có thể áp dụng một số thay đổi định dạng hoặc như vậy.

Cuối cùng, tôi cũng đã có một số thành công khi thực hiện SQL INSERT s (thông qua JDBC) vào trang tính Excel được truy cập thông qua cầu JDBC-ODBC. nghĩa là ODBC có thể tạo một tệp Excel trông giống như một cơ sở dữ liệu. Mặc dù nó không linh hoạt lắm, bạn không thể yêu cầu DB tạo các tệp .XLS tùy ý.


EDIT:

Có vẻ với tôi như readLine() đã không đem lại cho bạn toàn bộ dây chuyền. Làm thế nào để biết rằng vận chuyển trở lại không phải là một terminator dòng? Bạn sẽ có thể xác minh điều này với các lệnh in gỡ lỗi ngay sau readLine().

Nếu đây thực sự là như vậy, nó sẽ hút vì con đường phía trước sẽ cho bạn

  • hoặc nhận ra dòng không đầy đủ và dán chúng lại với nhau sau khi thực tế,
  • hoặc gửi thư thay thế của riêng bạn cho readLine(). Một cách tiếp cận đơn giản là đọc ký tự theo ký tự, thay thế CR trong chuỗi CSV và tích lũy văn bản trong StringBuilder cho đến khi bạn cảm thấy bạn có một dòng hoàn chỉnh.

Cả hai lựa chọn thay thế đều hoạt động mà bạn có thể không mong đợi.

+0

Vâng, tôi đang sử dụng dữ liệu được lấy từ một trang web (một trang mà tôi không kiểm soát được) và họ xuất dữ liệu này ở định dạng csv. Thật không may, một số chương trình mà tôi muốn sử dụng dữ liệu có yêu cầu tệp xls. Có, nó là vô nghĩa để "chuyển đổi", nhưng đó là một vấn đề với phần mềm mà tôi được yêu cầu sử dụng. Tôi đã cố gắng POI với một số thành công, nhưng nó có vẻ ghét nhân vật trả về (\ n) mà tôi đã có thể sử dụng trong CSV (dễ hiểu vì dấu phẩy là các dấu phân tách). Tôi sẽ đăng mã của tôi ở trên. Bất kỳ ý tưởng làm thế nào để loại bỏ các ký tự? Tôi sẽ đánh dấu nỗ lực của tôi ở trên. –

+0

@Justian: Lướt qua mã của bạn, tôi không thể tìm ra vấn đề bạn đang cố giải quyết. Các CR này nằm ở giữa các trường, hoặc vào cuối hồ sơ? Nếu họ đang ở trong các lĩnh vực, họ nên được thay thế bằng, nói, một trống duy nhất? Mã của bạn có thành công không khi thực hiện việc này? –

+0

Không, không phải. Hãy nói rằng tôi có các trường cho tên | vật nuôi | Mã Bưu Chính. Nếu tôi có cột nhiều dòng trong csv, như "john | dog (\ n) cat | 10000", cột này sẽ hiển thị là "john | dog" và (hàng tiếp theo) "cat | zip". Thật khó để hiển thị điều này với định dạng tự động của stackoverflow. Từ những gì tôi thấy, nó * nên * sửa lỗi này, nhưng không may mắn cho đến nay. –

0

Bạn đã viết:

Tôi có một cái gì đó để quản lý file csv đã được tại chỗ và tôi cần thêm tương thích cho các chương trình khác.

Các chương trình khác đó là gì? Họ có được yêu cầu truy cập dữ liệu của bạn thông qua các tệp Excel hay chúng có thể hoạt động với kết nối JDBC hoặc ODBC tới cơ sở dữ liệu không? Sử dụng cơ sở dữ liệu làm vị trí trung tâm, bạn có thể trích xuất dữ liệu thành tệp CSV hoặc các định dạng khác nếu cần.

+0

Kết nối JDBC hoặc ODBC sẽ không hoạt động trong trường hợp này. –

0

Các công cụ trong Excel không phù hợp với những gì OP muốn làm. Anh ấy đang đi đúng đường. Excel không thể nhập nhiều tệp CSV vào các trang tính khác nhau trong cùng một tệp, đó là lý do bạn muốn làm điều đó trong mã. Đề nghị của tôi là sử dụng OpenCSV để đọc CSV, vì nó có thể tự động sửa cho các dòng mới trong dữ liệu và các cột bị thiếu, và nó là mã nguồn mở và miễn phí. Nó thực sự rất, rất mạnh mẽ và có thể xử lý tất cả các loại tệp CSV không chuẩn khác nhau.

0

Tôi đã tạo một phần mềm nhỏ có tên là csv2xls. Nó cần Java.

+0

Liên kết không hoạt động. – Jaan

+0

Cảm ơn @Jaan. Bây giờ, nó là [ở đây] (https://github.com/sixro/incubateur/tree/master/csv2xls). – sixro

3

Sao chép dán chương trình dưới đây, tôi chạy chương trình và nó đang làm việc tốt, Hãy cho tôi biết nếu bạn có bất kỳ mối quan tâm về chương trình này. (Bạn cần Apache POI Jar để chạy chương trình này)

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 
    } 
} 
Các vấn đề liên quan