2013-08-05 8 views
8

सेट करने के बाद काम करना बंद कर देता है मेरे पास एक स्क्रिप्ट है जो छोटी xls तालिका (~ 25x15) उत्पन्न करती है। यह प्रतिशत और तार होता है और मैं एक अगर ऑपरेटर है कि इस कोड के साथ प्रतिशत प्रकार के रूप में वर्तमान कक्ष सेट है:PhpExcel 20 सेल प्रकार

$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%'); 

लेकिन जब मैं निर्यात और फ़ाइल मैं देख रहा हूँ देखो यह केवल बारे में प्रकार और शैली सेट करने में कामयाब 20 कोशिकाएं और बाकी सभी डिफ़ॉल्ट सेटिंग्स के साथ हैं। मैंने इसे डीबग किया और महसूस किया कि समस्या मेरे तर्क में नहीं है। मैंने PHP कैश मेमोरी बढ़ाने के बारे में पढ़ा - कोशिश की लेकिन यह काम नहीं किया। कृपया मदद करें क्योंकि मुझे कम से कम 15 गुना बड़ी तालिका निर्यात करने की आवश्यकता है। अग्रिम में धन्यवाद!

+1

चूंकि PHPExcel शैलियों की संख्या पर कोई सीमा नहीं लगाता है (हालांकि एक्सेल स्वयं करता है, यह 20 से ऊपर है), और उदाहरण फ़ोल्डर फ़ोल्डर में हमारी कई डेमो स्क्रिप्ट 20 से अधिक विभिन्न शैलियों, क्या आप कृपया कोड का एक उदाहरण उदाहरण प्रदान कर सकते हैं जो इस समस्या को प्रदर्शित करता है। यह हो सकता है कि समस्या किसी विशेष शैली में है जिसे आप कई शैलियों के बजाय सेटिंग कर रहे हैं। –

+0

आपके प्रश्न में '$ यह 'क्या है और आपके प्रश्न में' $ coords' क्या है और आपकी समस्या को पुन: उत्पन्न करने के लिए शेष न्यूनतम उदाहरण कहां है? http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions – hakre

उत्तर

1
<?php 
$file = 'output_log.txt'; 

function get_owner($file) 
{ 
    $stat = stat($file); 
    $user = posix_getpwuid($stat['uid']); 
    return $user['name']; 
} 

$format = "UID @ %s: %s\n"; 

printf($format, date('r'), get_owner($file)); 

chown($file, 'ross'); 
printf($format, date('r'), get_owner($file)); 

clearstatcache(); 
printf($format, date('r'), get_owner($file)); 
?> 

clearstatcache(); उपयोगी हो सकता है। Php पेज की शुरुआत में इस फ़ंक्शन को लोड करें।

+0

मैंने कोशिश की लेकिन यह काम नहीं किया। यहां वह कोड है जिसका मैं उपयोग कर रहा हूं http://pastebin.com/wjWuX8J0। यदि आप किसी अन्य सलाह देने का प्रबंधन करते हैं तो मुझे बहुत सराहना की जाएगी। – Martin

3

PHPExcel काफी कुछ स्मृति

आवंटित PHPExcel एक सुंदर पुस्तकालय है, का उपयोग कर इसे PHP के लिए आवंटित स्मृति की भारी मात्रा में आवश्यकता हो सकती है।

this thread के अनुसार, सिर्फ 5 कोशिकाओं प्रदर्शित हो सकती हैं 6 MByte स्मृति के उपयोग की:

<?php 
require_once 'php/PHPExcelSVN/PHPExcel/IOFactory.php'; 
$objPHPExcel = PHPExcel_IOFactory::load("php/tinytest.xlsx"); 
$objPHPExcel->setActiveSheetIndex(0); 
$objPHPExcel->getActiveSheet()->setCellValue('D2', 50); 
echo $objPHPExcel->getActiveSheet()->getCell('D8')->getCalculatedValue() . " 
"; 
echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB\r\n"; 
?> 

I get 6MB of memory usage. 

एक और user even failed with a 256MByte memory सेटिंग।

जबकि PHPExcel अपनी मेमोरी पदचिह्न को कम करने के तरीके प्रदान करता है, मेरे मामले में सभी कटौती बहुत कम हो गई है। This page on github PHPExcel के कैश प्रबंधन विकल्पों का विवरण प्रदान करता है। उदाहरण के लिए, इस सेटिंग को धारावाहिक और GZIPs एक वर्कशीट के सेल संरचना: के लिए पीएचपी एक्सेल

मैं PHPExcel instrumented

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa

PHPExcel holds an "in memory" representation of a spreadsheet, so it is susceptible to PHP's memory limitations. The memory made available to PHP can be increased by editing the value of the memorylimit directive in your php.ini file, or by using iniset('memory_limit', '128M') within your code (ISP permitting);

Some Readers and Writers are faster than others, and they also use differing amounts of memory. You can find some indication of the relative performance and memory usage for the different Readers and Writers, over the different versions of PHPExcel, here http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=234150

If you've already increased memory to a maximum, or can't change your memory limit, then this discussion on the board describes some of the methods that can be applied to reduce the memory usage of your scripts using PHPExcel http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=242712

मापन परिणाम:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; 

PHPExcel_Settings::setCacheStorageMethod($cacheMethod); 

PHPExcel's FAQ यह बताता है उदाहरण फ़ाइल [01simple.php][5] और कुछ त्वरित परीक्षण किया था।

सेवन 92 kbyte:

for($n=0; $n<200; $n++) { 
    $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); 
} 

खपत 4164 KBytes:

for($n=0; $n<200; $n++) { 
    $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); 
    $objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true); 
} 

एक यह टुकड़ा कई बार अपरिवर्तित निष्पादित करता है, तो प्रत्येक खंड के चारों ओर 4 मेगाबाइट खपत करता है।

अपने अनुप्रयोग जाँच हो रही है तार्किक रूप से सही है

सुनिश्चित करने के लिए है कि आपकी ऐप तार्किक रूप से सही है, मैं पहले पीएचपी स्मृति में वृद्धि करने का प्रस्ताव करता हूँ: मेरे मामले में

ini_set('memory_limit', '32M'); 

, मैं करने के लिए है एक ऑनलाइन मूल्यांकन आवेदन के परिणाम परिणाम निर्यात करने के लिए निर्यात।जबकि क्षैतिज रूप से 100 से कम कोशिकाएं हैं, मुझे कई 10.000 पंक्तियों को निर्यात करने की आवश्यकता है। जबकि कोशिकाओं की मात्रा बड़ी थी, मेरी प्रत्येक कोशिका में एक संख्या या 3 वर्णों की एक स्ट्रिंग होती है - कोई सूत्र नहीं, कोई शैलियों नहीं।

मजबूत स्मृति प्रतिबंध या बड़े स्प्रेडशीट

मेरे मामले में के मामले में, कैश से कोई भी विकल्प के रूप में आवश्यक के रूप में ज्यादा राशि कम कर दिया। इसके अलावा, आवेदन का रनटाइम काफी बढ़ गया।

अंत में मुझे पुराने फैशन वाले सीएसवी-डेटा फ़ाइल निर्यात पर स्विच करना पड़ा।

+1

कृपया 'PHPExcel स्प्रेडशीट की प्रत्येक सेल' के लगभग 20 KBytes स्मृति के लिए आपका संदर्भ उद्धृत करें। ... अंगूठे का मेरा नियम हमेशा 32-बिट PHP और 1.6k/सेल पर 1k/सेल रहा है यदि आप उपयोग कर रहे हैं 64-बिट PHP –

+0

यह PHPExcel मेमोरी प्रबंधन के खिलाफ एक रान से थोड़ा अधिक प्रतीत होता है, और किसी भी तरह से शैलियों के बारे में ओपी के सवाल का जवाब नहीं देता है। ओपी बिल्कुल स्मृति का जिक्र नहीं करता है। और यह PHPExcel –

+0

में स्मृति उपयोग को कम करने के लिए किसी भी तकनीक का उल्लेख नहीं करता है, COM के साथ समस्या, और कारण एमएस इसकी अनुशंसा क्यों नहीं करता है, यह है कि जब आप एक से अधिक COM ऑब्जेक्ट के साथ काम करने का प्रयास कर रहे हैं तो यह समस्याएं पैदा करता है (या एक से अधिक एक्सेल फ़ाइल) एक समय में ....लेकिन यह विंडोज सर्वर –

2

मैंने स्थानीय रूप से अपना कोड चलाया और पाया कि आपके द्वारा इस प्रतिशत पर सेट की गई सभी 26 कोशिकाओं में सही प्रारूप और% चिह्न था। मुझे निश्चित रूप से 136-137 लाइनों को असम्बद्ध करना पड़ा।

यह आपके सेटअप से संबंधित होना चाहिए। मैं कल्पना नहीं कर सकता कि इस आकार की स्प्रेडशीट के लिए आपको बहुत कम स्मृति होगी।

आपकी जानकारी के लिए, मैंने पुष्टि की है कि यह पीएचपी एक्सेल संस्करण संस्करण 1.7.6, 2011-02-27 के साथ PHP संस्करण 5.4.16 पर काम करता है। मैंने एमएस एक्सेल 2007 के साथ स्प्रेडशीट खोला।

+0

नवीनतम संस्करण के साथ, 1.7.9। 17:01:54 वर्तमान मेमोरी यूज: 5.5 एमबी 17:01:54 पीक मेमोरी यूज: 5.5 एमबी – Spork

+1

इसका मतलब यह होगा कि लिपि आपकी मशीन पर काम करती है और मेरा काम नहीं करती है ... – Martin

+0

यह केवल मशीन हो सकती है निर्भर अगर यह स्मृति थी, लेकिन मेरे पास विशेष रूप से प्रभावशाली मशीन नहीं है। मैं PHP संस्करणों या PHPExcel संस्करणों में एक अंतर की ओर झुकना होगा। तुम्हारे क्या हैं? – Spork