File Microsoft Word dan Excel bukan file teks yang hanya dapat Anda ganti teksnya dan yang pasti tidak akan berfungsi dengan BLOB
. dokx dan xlsx file sebenarnya adalah file zip (coba ubah ekstensi file dan buka ritsleting untuk melihat sendiri) yang berisi definisi XML dokumen. Jadi, Anda perlu:
- Buka zip file
- Konversi file yang perlu diubah dari
BLOB
keCLOB
- Ubah konten file XML yang sesuai
- Konversi file kembali ke
BLOB
dariCLOB
- Tambahkan file yang dimodifikasi kembali ke file zip
Saya telah menulis kode di bawah ini sebagai contoh tentang cara melakukan penggantian ke docx mengajukan. Untuk xlsx file, setiap lembar Excel terkandung dalam file XML yang berbeda sehingga Anda perlu sedikit memodifikasi kode agar berfungsi dengan kedua jenis file.
Kode tidak menggunakan APEX_ZIP paket yang sangat menyederhanakan bekerja dengan file zip dan juga membuat kode contoh sedikit lebih jelas tentang apa yang sedang terjadi. Jika Anda belum menginstal APEX, Anda perlu mengetahui cara melakukan unzip/rezip file menggunakan paket Oracle yang Anda miliki.
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;