माइक्रोसॉफ्ट वर्ड और एक्सेल फाइलें टेक्स्ट फाइल नहीं हैं जिन्हें आप सिर्फ टेक्स्ट को बदल सकते हैं और यह निश्चित रूप से BLOB
के साथ काम नहीं करेगा। . docx और xlsx फ़ाइलें वास्तव में ज़िप फ़ाइलें हैं (फ़ाइल एक्सटेंशन को बदलने और स्वयं को देखने के लिए अनज़िपिंग करने का प्रयास करें) जिसमें दस्तावेज़ की XML परिभाषा होती है। तो आपको यह करना होगा:
- फ़ाइल को अनज़िप करें
- उस फ़ाइल को कनवर्ट करें जिसे
BLOB
से बदलने की आवश्यकता है एकCLOB
. के लिए - उचित XML फ़ाइल की सामग्री को संशोधित करें
- फ़ाइल को वापस
BLOB
में बदलें एकCLOB
. से - संशोधित फ़ाइल को वापस ज़िप फ़ाइल में जोड़ें
मैंने नीचे दिए गए कोड को एक उदाहरण के रूप में लिखा है कि कैसे एक docx . का प्रतिस्थापन किया जाए फ़ाइल। xlsx . के लिए फाइलें, प्रत्येक एक्सेल शीट एक अलग एक्सएमएल फाइल में समाहित है, इसलिए आपको कोड को थोड़ा संशोधित करने की आवश्यकता होगी ताकि यह दोनों फाइल प्रकारों के साथ काम कर सके।
कोड APEX_ZIP पैकेज जो ज़िप फ़ाइलों के साथ काम करना बहुत सरल करता है और उदाहरण कोड को थोड़ा स्पष्ट करता है कि क्या हो रहा है। यदि आपके पास एपेक्स स्थापित नहीं है, तो आपको यह पता लगाने की आवश्यकता होगी कि आपके पास मौजूद Oracle पैकेजों का उपयोग करके फ़ाइलों की अनज़िपिंग/रीज़िपिंग कैसे करें।
DECLARE
l_old_file BLOB;
l_new_file BLOB;
l_files apex_zip.t_files;
l_document BLOB;
l_clob CLOB;
l_dest_offsset INTEGER;
l_src_offsset INTEGER;
l_lang_context INTEGER := DBMS_LOB.default_lang_ctx;
l_warning INTEGER;
BEGIN
-- Get the blob you want to "correct"
SELECT blob_content
INTO l_old_file
FROM apex_application_temp_files
WHERE ROWNUM = 1;
-- Get a list of all the file names contained within the zip
l_files := apex_zip.get_files (l_old_file);
-- Loop through all the files adding each one to the new zip
FOR i IN l_files.FIRST .. l_files.LAST
LOOP
l_document := apex_zip.get_file_content (l_old_file, l_files (i));
IF l_files (i) = 'word/document.xml'
THEN
-- if the file name is word/document.xml then make the changes to it
DBMS_LOB.createTemporary (lob_loc => l_clob, cache => FALSE);
l_dest_offsset := 1;
l_src_offsset := 1;
DBMS_LOB.converttoclob (dest_lob => l_clob,
src_blob => l_document,
amount => DBMS_LOB.lobmaxsize,
dest_offset => l_dest_offsset,
src_offset => l_src_offsset,
blob_csid => DBMS_LOB.default_csid,
lang_context => l_lang_context,
warning => l_warning);
--------------------
-- This is where you would do any replacements
--------------------
l_clob := REPLACE (l_clob, 'www.google.co.uk', 'www.google.com');
--------------------
l_dest_offsset := 1;
l_src_offsset := 1;
DBMS_LOB.CONVERTTOBLOB (dest_lob => l_document,
src_clob => l_clob,
amount => DBMS_LOB.lobmaxsize,
dest_offset => l_dest_offsset,
src_offset => l_src_offsset,
blob_csid => DBMS_LOB.default_csid,
lang_context => l_lang_context,
warning => l_warning);
END IF;
apex_zip.add_file (l_new_file, l_files (i), l_document);
END LOOP;
apex_zip.finish (l_new_file);
--Do whatever you want with the "new" file here
END;