سؤال

هل يعرف أي شخص هنا أي طريقة سريعة ونظيفة لتحويل ملفات CSV إلى ملفات XLS أو XLSX في Java؟

لديّ شيء لإدارة ملفات CSV الموجودة بالفعل وأحتاج إلى توافق إضافي للبرامج الأخرى.

عينة الكود بالإضافة إلى أسماء الحزم دائما موضع تقدير جيد.

شكرا جزيلا،

جوستيان

هذا هو رمز بلدي حتى الآن. أحتاج إلى إزالة العوائد (" n") من السطور. تحتوي بعض خلوياتي على خطوط متعددة من المعلومات (قائمة) ، حتى أتمكن من استخدام " n" في CSV للإشارة إلى خطوط متعددة داخل أ زنزانة, ، لكن XLS تعامل هذه كما لو كنت أقصد وضعها على جديد خط.

يتم تعديل الكود من الإنترنت وفوضى صغيرة في الوقت الحالي. قد تلاحظ بعض الأساليب التي تم إهمالها ، كما تم كتابتها في عام 2004 ، وتأكد من تجاهل عبارات العودة الرهيبة. أنا فقط أستخدم 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 "";
    }
}
هل كانت مفيدة؟

المحلول

لا أعرف إذا كنت تعرف هذا بالفعل ، ولكن:

  • Excel (إذا كان هذا هو هدفك الحقيقي) يمكن القراءة بسهولة .csv الملفات مباشرة ، وبالتالي فإن أي تحويل تقوم به لن يكون مجاملة لمستخدمي "الموهوبين" الأقل ".
  • CSV هو تنسيق المدين الأدنى. من غير المحتمل أن يضيف أي محول معلومات إلى تلك الموجودة في أ .csv ملف سيجعله أكثر فائدة. بمعنى آخر ، CSV هو تنسيق "غبي" ويحوله إلى .xls سوف (ربما) زيادة حجم الملف ولكن لا تجعل التنسيق أكثر ذكاءً.

اقتراح كورتيس لـ POI هو أول شيء سيتبادر إلى ذهني أيضًا.

إذا كنت تقوم بهذا التحويل على جهاز Windows ، فقد يكون هناك بديل آخر يعقوب, ، جسر Java-Com الذي يسمح لك بالتحكم عن بُعد بشكل فعال من برنامج Java لفعل أشياء مثل فتح ملف وحفظها بتنسيق مختلف ، وربما حتى تطبيق بعض التغييرات التنسيق أو ذلك.

أخيرًا ، لقد حققت أيضًا بعض النجاح في القيام بـ SQL INSERTS (عبر JDBC) في ورقة عمل Excel التي تم الوصول إليها عبر جسر JDBC-ODBC. يمكن أن تجعل IE ODBC ملف Excel وكأنه قاعدة بيانات. إنه ليس مرنًا للغاية ، لا يمكنك أن تطلب من DB إنشاء اسمه تعسفيًا .XLS الملفات.


تعديل:

يبدو لي مثل readLine() هو بالفعل لا يمنحك خطوط كاملة. كيف يمكن معرفة أن عودة النقل ليست عبارة عن طرفي خط؟ يجب أن تكون قادرًا على التحقق من ذلك من خلال بيانات طباعة التصحيح مباشرة بعد القراءة ().

إذا كان الأمر كذلك بالفعل ، فسيكون ذلك يمتص لأن الطريق إلى الأمام سيكون لك

  • إما إما التعرف على الخطوط غير المكتملة ولصقها معًا بعد الحقيقة ،
  • أو اكتب بديلك الخاص لـ readline (). تتمثل النهج البسيط في قراءة الحرف عن طريق الحرف ، واستبدال CRS داخل سلسلة CSV ونص تراكم في StringBuilder حتى تشعر أن لديك خطًا كاملاً.

كلا البديلين عمل ربما لم تكن تتطلع إليها.

نصائح أخرى

انسخ برنامج Paste أدناه ، قمت بتشغيل البرنامج وهو يعمل بشكل جيد ، اسمحوا لي أن أعرف ما إذا كان لديك أي مخاوف بشأن هذا البرنامج. (تحتاج إلى 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
    }
}

إذا كنت ترغب في قراءة أو كتابة ملفات XLS أو XLSX في Java ، فإن Apache POI هو رهان جيد: http://poi.apache.org/

الأدوات في Excel ليست كافية لما يريد OP القيام به. إنه على المسار الصحيح هناك. لا يمكن لـ Excel استيراد ملفات CSV المتعددة إلى أوراق عمل مختلفة في نفس الملف ، وهذا هو السبب في أنك تريد القيام بذلك في التعليمات البرمجية. اقتراحي هو استخدام OpenCSV لقراءة CSV ، حيث يمكن أن يصحح تلقائيًا للخطوط الجديدة في البيانات والأعمدة المفقودة ، وهو مجاني ومفتوح المصدر. إنه في الواقع قوي للغاية ويمكنه التعامل مع جميع أنواع ملفات CSV المختلفة غير القياسية.

انت كتبت:

لديّ شيء لإدارة ملفات CSV الموجودة بالفعل وأحتاج إلى توافق إضافي للبرامج الأخرى.

ما هي تلك البرامج الأخرى؟ هل يتعين عليهم الوصول إلى بياناتك من خلال ملفات Excel ، أو هل يمكنهم العمل مع اتصال JDBC أو ODBC بقاعدة بيانات؟ باستخدام قاعدة بيانات كموقع مركزي ، يمكنك استخراج البيانات في ملفات CSV أو تنسيقات أخرى حسب الحاجة.

لقد قمت بإنشاء برنامج صغير يسمى CSV2XLS. يحتاج جافا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top