Файл Excel, созданный файлом JAR, разбивается на более мелкие файлы, несмотря на то, что в моей среде IDE этого не делается - PullRequest
0 голосов
/ 02 октября 2019

У меня есть программа, которая извлекает данные из SQL-запроса с возможностью создания и записи искомых данных в файл Excel. Эта программа может извлекать данные из нескольких запросов и отправляет эти данные в файл Excel для всех из них, кроме одного. Тот, который вызывает у меня проблемы, извлекает около 350 результатов из своего запроса, что является наибольшей суммой, запрошенной запросом. Когда я создаю файл Excel в Eclipse, он просто создает один файл Excel, как и предполагалось. Если я превращу программу в файл JAR и создаю файл Excel, используя тот же запрос, файл Excel разбивается на 5 различных файлов Excel, каждый из которых содержит примерно 50-60 результатов.

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

Это мой файл для записи в файл Excel. Данные, полученные в результате поиска SQL, хранятся в 13 различных списках, по одному списку для каждого столбца в поиске SQL. Код берет сегодняшнюю дату и время и добавляет его в заголовок файла. tableMade получает значение false при первом создании файла Excel, так как первое, что добавляется в файлы Excel, - это имена столбцов. Если для этого параметра не установлено значение false, writeToExcel будет добавлять имена столбцов каждый раз, когда добавляет данные в файл Excel.

public static void writeToExcel(String a, String b, String c, String d,
        String e, String f, String g, String h, String i,
        String j, String k, String l, String m){
    try{//sends data from toExcel to an excel file
        Date date2 = Calendar.getInstance().getTime();
        DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
        String strDate = dateFormat.format(date2);//above creates title date/time
        String fileName = "Date "+ strDate + ".csv";//creates title: Data_For_yyyy_MM_dd_HH_mm_SS
        FileOutputStream fos = new FileOutputStream(fileName,true);//creates new excel file 
        PrintWriter pw = new PrintWriter(fos);
        if(tableMade == false){
            pw.println(a + "," + b + "," +c+ "," +d+ "," +e
        + "," +f+ "," +g+ "," +h+ "," +i+ "," +j+ "," +k+ "," +l+"'"+m+ "\t");
            tableMade = true;//writes to excel file
        }

        pw.println(a + "," + b + "," +c+ "," +d+ "," +e
        + "," +f+ "," +g+ "," +h+ "," +i+ "," +j+ "," +k+ "," +l+"'"+m+ "\t");

        pw.close();

        System.out.println(fileName + " was created"); 
    }
    catch(FileNotFoundException ex){
        System.out.println("Write to excel failed"); 
    }
}

Это код кнопки, которая вызывает writeToExcel. При нажатии запускается этот код, который создает файл Excel. Код выполняет итерацию по каждому из 13 списков одновременно, передавая значение, на которое в данный момент указывается значение в каждом списке, в качестве аргументов для writeToExcel.

for(int i = 0; i < list1.size(); i++) {
                writeToExcel(list1.get(i), list2.get(i), list3.get(i), list4.get(i), list5.get(i),
                list6.get(i), list7.get(i), list8.get(i), list9.get(i), list10.get(i), list11.get(i),
                list12.get(i), list13.get(i)); 
            }
            excelAllowed = false; 
            tableMade = false;
        }

Ожидаемый результат - 1 файл Excel, содержащий всю запрашиваемую дату, однако фактический вывод при запуске из файла JAR - 5-6 файлов Excel, каждый из которых содержит часть данных.

1 Ответ

1 голос
/ 03 октября 2019

Вероятно, у нескольких файлов CSV есть разные метки времени в именах файлов, так как вы определяете метки времени в секундах:

Date date2 = Calendar.getInstance().getTime();
DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
String strDate = dateFormat.format(date2);

При каждом проходе очень длинного цикла, вероятно, проходит несколько секунд и, следовательно, запятаясоздаются файлы с разделенными значениями (CSV) (не файлы Excel с двоичными типами - .xls, .xlsx, .xlsm, .xlsb). Установите отметку времени в минуту или час, и все результаты могут содержаться в одном файле CSV.

DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm"); 

В качестве альтернативы, укажите имя файла вне метода и цикла, чтобы использовать отметку времени при нажатии кнопки:

Date date2 = Calendar.getInstance().getTime();
DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
String strDate = dateFormat.format(date2);              
String fileName = "Date "+ strDate + ".csv";

for(int i = 0; i < list1.size(); i++) {
     writeToExcel(...);                    // REMOVE fileName FROM INSIDE METHOD
}
...