أبي لكتابة ملفات إكسيل ضخمة باستخدام جافا [java]


Answers

في محاولة لاستخدام المصنف سسف ، وهذا شيء عظيم لوثائق زلس ضخمة، وثيقة بناء ولا تأكل ذاكرة الوصول العشوائي على الإطلاق، بيكاس باستخدام نيو

Question

أنا أتطلع إلى الكتابة إلى إكسيل (.xls مس إكسيل 2003 تنسيق) ملف بشكل منهجي باستخدام جافا. قد تحتوي الملفات الانتاج إكسيل ~ 200،000 الصفوف التي أعتزم تقسيمها على عدد من الأوراق (64k الصفوف لكل ورقة، ويرجع ذلك إلى حد اكسل).

لقد حاولت استخدام أبي بوي أباتشي ولكن يبدو أن خنزير الذاكرة بسبب نموذج كائن أبي. أنا مضطر إلى إضافة خلايا / أوراق إلى كائن المصنف في الذاكرة وفقط مرة واحدة يتم إضافة كافة البيانات، ويمكنني كتابة المصنف إلى ملف! هنا عينة من كيفية أباتشي توصي كتابة ملفات إكسيل باستخدام أبي:

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");

//Create a row and put some cells in it
Row row = sheet.createRow((short)0);

// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

ومن الواضح أن كتابة ~ 20K الصفوف (مع بعض الأعمدة 10-20 في كل صف) يعطيني "java.lang.OutOfMemoryError: جافا كومة الفضاء".

لقد حاولت زيادة جفم الأولية هيبسيزي والحد الأقصى كومة الحجم باستخدام شمز و شمكس المعلمات كما Xms512m و Xmx1024. لا يزال غير قادر على كتابة أكثر من 150K الصفوف إلى الملف.

أنا أبحث عن وسيلة لتيار إلى ملف اكسل بدلا من بناء الملف بأكمله في الذاكرة قبل كتابته إلى القرص الذي نأمل حفظ الكثير من استخدام الذاكرة. أي أبي بديل أو حلول سيكون موضع تقدير، ولكن أنا يقتصر على استخدام جافا. شكر! :)




إلقاء نظرة على هسف التسلسلي من مشروع شرنقة.

و هسف التسلسلي يمسك الأحداث ساكس ويخلق جدول بيانات في شكل زلس المستخدمة من قبل ميكروسوفت إكسيل




جرب استخدام تنسيق كسف. بهذه الطريقة كنت لا تقتصر الذاكرة بعد الآن --ويل، ربما فقط أثناء بريبوبولاتينغ البيانات ل كسف، ولكن هذا يمكن القيام به بكفاءة كذلك، على سبيل المثال الاستعلام مجموعات فرعية من الصفوف من دب باستخدام على سبيل المثال LIMIT/OFFSET والكتابة على الفور ملف بدلا من نقل محتويات الجدول دب بالكامل في ذاكرة جافا قبل كتابة أي سطر. سيزيد حدود إكسيل من الصفوف كمية في "ورقة" واحد إلى حوالي مليون.

ومع ذلك، إذا كانت البيانات تأتي بالفعل من دب، ثم أود إعادة النظر إلى حد كبير إذا جافا هو الأداة المناسبة لهذا. معظم ديسيبل لائق لديها وظيفة التصدير إلى كسف التي يمكن أن تفعل هذه المهمة دون شك أكثر كفاءة بكثير. في حالة ميسكل على سبيل المثال، يمكنك استخدام الأمر LOAD DATA INFILE لهذا.




هل تحدث مشكلة الذاكرة هذه عند إدراج البيانات في الخلية، أو عند إجراء حساب / توليد البيانات؟

إذا كنت تسير لتحميل الملفات إلى التفوق التي تتكون من شكل قالب ثابت مسبقا، ثم أفضل لحفظ قالب وإعادة استخدام عدة مرات. تحدث حالات القالب عادة عندما تنوي إنشاء تقرير مبيعات يومي أو ما إلى ذلك ...

آخر، في كل مرة تحتاج إلى إنشاء صف جديد، الحدود، العمود الخ من الصفر.

حتى الآن، أباتشي بوي هو الخيار الوحيد الذي وجدت.

"بوضوح، كتابة ~ 20K الصفوف (مع بعض الأعمدة 10-20 في كل صف) يعطيني" java.lang.OutOfMemoryError: جافا كومة الفضاء ".

"إنتيربريس إيت"

ما يمكنك القيام به هو تنفيذ دفعة إدخال البيانات. إنشاء جدول كويويتاسك، في كل مرة بعد توليد 1 صفحة، والراحة لمدة ثانية، ثم تابع الجزء الثاني. إذا كنت قلقا بشأن تغييرات البيانات الديناميكية أثناء مهمة قائمة الانتظار، يمكنك أولا الحصول على المفتاح الأساسي في إكسيل (عن طريق إخفاء وقفل العمود من عرض المستخدم). سيتم تشغيل أول تشغيل المفتاح الأساسي، ثم الطابور الثاني تشغيل فصاعدا سوف تقرأ من المفكرة والقيام جزء المهمة حسب الجزء.