Nhúng hình ảnh vào tệp Excel bằng JavaScript và SheetJS
Khi phát triển tiện ích mở rộng của Chrome tạo tệp Excel (.xlsx), việc nhúng hình ảnh trực tiếp vào ô có thể là một nhiệm vụ đầy thách thức. Trong khi JavaScript và các thư viện như SheetJS đơn giản hóa việc tạo và chỉnh sửa bảng tính, việc xử lý hình ảnh nhúng thường yêu cầu xử lý cụ thể hơn.
Trong nhiều trường hợp, nhà phát triển phải đối mặt với hạn chế là chỉ có thể thêm liên kết hình ảnh vào ô thay vì nhúng hình ảnh trực tiếp. Vấn đề này phát sinh từ sự phức tạp liên quan đến việc chuyển đổi dữ liệu hình ảnh và định dạng tệp Excel, đặc biệt là trong môi trường trình duyệt như tiện ích mở rộng của Chrome.
Trong bài viết này, chúng ta sẽ khám phá giải pháp nhúng hình ảnh trực tiếp vào ô tệp Excel bằng JavaScript. Hình ảnh sẽ được tìm nạp từ các phần tử HTML và chèn vào các ô Excel thích hợp, mang lại trải nghiệm liền mạch hơn cho người dùng cần dữ liệu trực quan trong bảng tính của họ.
Chúng ta sẽ thảo luận cách tích hợp các thư viện như ExcelJS và giải quyết các thách thức phổ biến như nhúng hình ảnh vào môi trường tiện ích mở rộng được bảo vệ của Chrome. Ngoài ra, chúng tôi sẽ xem xét sự khác biệt giữa các phương pháp tiếp cận tiện ích mở rộng của Node.js và Chrome để đảm bảo triển khai thành công.
Yêu cầu | Ví dụ về sử dụng |
---|---|
ExcelJS.Workbook() | Thao tác này sẽ tạo một đối tượng sổ làm việc Excel mới trong môi trường Node.js bằng thư viện ExcelJS. Điều cần thiết là tạo các tệp Excel từ đầu, bao gồm bảng tính, định dạng và hình ảnh. |
addWorksheet() | Phương pháp này thêm một bảng tính mới vào sổ làm việc. Trong bối cảnh của vấn đề này, nó được sử dụng để tạo một trang tính có thể chèn dữ liệu (cả văn bản và hình ảnh). |
axios.get() | Được sử dụng để lấy dữ liệu hình ảnh từ một URL. Nó lấy dữ liệu hình ảnh nhị phân ở định dạng bộ đệm mảng, cần thiết để nhúng hình ảnh vào các ô Excel. |
workbook.addImage() | Lệnh này thêm hình ảnh vào sổ làm việc Excel. Hình ảnh có thể được cung cấp dưới dạng bộ đệm dữ liệu nhị phân, điều này rất cần thiết để nhúng hình ảnh vào các ô cụ thể. |
worksheet.addImage() | Phương pháp này chịu trách nhiệm đặt hình ảnh đã thêm vào một ô hoặc phạm vi ô cụ thể trong bảng tính, cho phép các phần tử trực quan được nhúng cùng với dữ liệu văn bản. |
fetch() | Trong môi trường trình duyệt, lệnh này được sử dụng để yêu cầu hình ảnh từ máy chủ từ xa và truy xuất nó dưới dạng blob. Sau đó, blob được chuyển đổi thành chuỗi được mã hóa base64 để nhúng vào Excel. |
FileReader.readAsDataURL() | Lệnh này chuyển đổi dữ liệu blob (đối tượng lớn nhị phân) được lấy từ URL hình ảnh thành chuỗi base64, làm cho nó tương thích để nhúng vào tệp Excel thông qua SheetJS. |
aoa_to_sheet() | Phương thức này từ SheetJS chuyển đổi một mảng mảng (AoA) thành một bảng Excel. Nó đặc biệt hữu ích khi thiết lập các cấu trúc dữ liệu đơn giản bao gồm cả văn bản và hình ảnh. |
writeFile() | Hàm này trong cả ExcelJS và SheetJS đều lưu tệp Excel được tạo cùng với các hình ảnh được nhúng vào hệ thống tệp cục bộ. Đây là bước cuối cùng sau khi tạo sổ làm việc và thêm tất cả các thành phần cần thiết. |
Cách nhúng hình ảnh vào ô Excel bằng JavaScript và ExcelJS
Tập lệnh tôi đã cung cấp giải quyết vấn đề nhúng hình ảnh trực tiếp vào các ô Excel bằng cách sử dụng JavaScript, ExcelJS và Axios. Đầu tiên, tập lệnh bắt đầu bằng cách khởi tạo một sổ làm việc mới bằng ExcelJS bằng lệnh ExcelJS.Workbook(), đây là nền tảng để tạo các tệp Excel. Sau đó nó tạo một bảng tính bằng cách gọi addWorksheet(). Bảng tính này đóng vai trò là nơi chứa tất cả dữ liệu và hình ảnh sẽ được thêm vào. Dữ liệu mẫu bao gồm các URL hình ảnh mà sau này sẽ được tìm nạp và nhúng vào các ô cụ thể.
Để xử lý việc tìm nạp hình ảnh, tập lệnh sử dụng thư viện Axios với axios.get() để yêu cầu hình ảnh từ URL của họ. Axios truy xuất hình ảnh dưới dạng dữ liệu nhị phân bằng cách sử dụng "arraybuffer" kiểu phản hồi, phù hợp để nhúng nội dung nhị phân như hình ảnh vào tệp Excel. Sau khi nhận được dữ liệu, hình ảnh được chuyển đổi sang định dạng bộ đệm, cho phép ExcelJS nhận dạng đó là hình ảnh hợp lệ để nhúng vào ô.
Sau khi hình ảnh được tìm nạp và xử lý, lệnh sổ làm việc.addImage() được sử dụng để chèn hình ảnh vào sổ làm việc. Bước này xác định hình ảnh và chuẩn bị để đặt nó vào một vị trí cụ thể trong trang tính. Theo sau điều này, bảng tính.addImage() chỉ định vị trí đặt hình ảnh, trong trường hợp này là cột "B" của hàng hiện tại. Chiều cao của hàng được điều chỉnh để đảm bảo rằng hình ảnh vừa khít trong ô.
Cuối cùng, tập lệnh lưu sổ làm việc bằng cách sử dụng sổ làm việc.xlsx.writeFile(), ghi tệp vào hệ thống cục bộ. Thao tác này sẽ hoàn tất quy trình, tạo ra một tệp Excel có hình ảnh được nhúng trực tiếp vào các ô chứ không chỉ là các liên kết. Phương pháp này mang lại hiệu quả cao trong trường hợp cần đưa hình ảnh vào báo cáo hoặc bảng dữ liệu, mang lại trải nghiệm liền mạch cho người dùng tương tác với các tệp Excel chứa cả dữ liệu và yếu tố hình ảnh.
Nhúng hình ảnh vào ô Excel bằng ExcelJS và Axios
Giải pháp này sử dụng Node.js, ExcelJS để tạo sổ làm việc Excel và Axios để tìm nạp dữ liệu hình ảnh. Nó xử lý việc nhúng hình ảnh trực tiếp vào các ô Excel.
const ExcelJS = require('exceljs');
const axios = require('axios');
async function addImageToExcel() {
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('My Sheet');
const data = [
{ id: 1, imageUrl: 'https://example.com/image1.png' },
{ id: 2, imageUrl: 'https://example.com/image2.png' }
];
worksheet.columns = [
{ header: 'ID', key: 'id', width: 10 },
{ header: 'Image', key: 'image', width: 30 }
];
for (const item of data) {
const row = worksheet.addRow({ id: item.id });
row.height = 90;
const imageId = workbook.addImage({
buffer: (await axios.get(item.imageUrl, { responseType: 'arraybuffer' })).data,
extension: 'png'
});
worksheet.addImage(imageId, \`B${row.number}:B${row.number}\`);
}
await workbook.xlsx.writeFile('ExcelWithImages.xlsx');
console.log('Excel file with images saved!');
}
addImageToExcel().catch(console.error);
Nhúng hình ảnh trong Excel bằng dữ liệu Base64 và SheetJS
Giải pháp này tập trung vào việc tìm nạp hình ảnh và chuyển đổi chúng sang định dạng base64 trước khi nhúng chúng vào tệp Excel bằng SheetJS trong môi trường tiện ích mở rộng Chrome.
async function getImageBase64(url) {
const response = await fetch(url);
const blob = await response.blob();
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.onerror = reject;
reader.readAsDataURL(blob);
});
}
async function addImageToSheetJS() {
const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet([[ 'ID', 'Image' ]]);
const imageData = await getImageBase64('https://example.com/image.png');
ws['!merges'] = [{ s: { c: 1, r: 1 }, e: { c: 1, r: 5 } }];
ws['B2'] = { t: 's', v: imageData, l: { Target: 'base64 image' } };
XLSX.utils.book_append_sheet(wb, ws, 'Sheet 1');
XLSX.writeFile(wb, 'SheetWithImages.xlsx');
}
addImageToSheetJS();
Tối ưu hóa việc nhúng hình ảnh vào tệp Excel cho tiện ích mở rộng của Chrome
Khi phát triển một Tiện ích mở rộng của Chrome tích hợp hình ảnh vào tệp Excel, một thách thức lớn là làm thế nào để xử lý việc nhúng hình ảnh trong môi trường trình duyệt. Không giống như môi trường Node.js truyền thống, các tiện ích mở rộng của Chrome đi kèm với các hạn chế về hiệu suất và bảo mật bổ sung nhằm ngăn chặn quyền truy cập trực tiếp vào một số API nhất định. Điều này có nghĩa là các phương pháp như tìm nạp hình ảnh bằng thư viện như Axios có thể cần các giải pháp thay thế để tuân thủ chính sách của trình duyệt.
Một giải pháp cho môi trường trình duyệt có thể liên quan đến việc sử dụng cơ sở64 hình ảnh được mã hóa thay vì dữ liệu nhị phân thô. Mã hóa Base64 cho phép hình ảnh dễ dàng được chuyển và lưu trữ dưới dạng chuỗi, sau đó có thể nhúng trực tiếp vào trang tính Excel bằng các thư viện như SheetJS. Trong trường hợp này, mã hóa base64 giúp khắc phục các hạn chế bảo mật do Chrome áp đặt, đặc biệt vì các tiện ích mở rộng không thể thực thi mã dành riêng cho Node.js.
Một khía cạnh quan trọng khác cần xem xét là việc xử lý các tập dữ liệu hình ảnh lớn trong tệp Excel. Nhúng nhiều hình ảnh vào một trang tính Excel có thể làm tăng đáng kể kích thước tệp, điều này có thể ảnh hưởng đến hiệu suất, đặc biệt là trong ứng dụng dựa trên trình duyệt. Để tối ưu hóa điều này, nhà phát triển nên sử dụng các định dạng ảnh nén như WebP hoặc JPEG để giảm thiểu kích thước file mà vẫn đảm bảo chất lượng hình ảnh được giữ nguyên.
Các câu hỏi thường gặp về việc nhúng hình ảnh vào Excel bằng JavaScript
- Làm cách nào tôi có thể tìm nạp hình ảnh trong môi trường tiện ích mở rộng của Chrome?
- Trong tiện ích mở rộng của Chrome, bạn có thể sử dụng fetch() để truy xuất hình ảnh từ một URL và chuyển đổi chúng thành base64 bằng cách sử dụng FileReader để nhúng.
- Hình ảnh nên ở định dạng nào để tránh kích thước tệp lớn?
- Nên sử dụng WebP hoặc JPEG vì chúng cung cấp khả năng nén tốt hơn và giảm kích thước tệp Excel cuối cùng.
- Có thể nhúng nhiều hình ảnh vào một tệp Excel không?
- Có, sử dụng các thư viện như ExcelJS hoặc SheetJS, bạn có thể nhúng nhiều hình ảnh vào các ô khác nhau bằng cách lặp qua một loạt URL hình ảnh.
- Sự khác biệt giữa việc nhúng hình ảnh trong Node.js và trình duyệt là gì?
- Trong Node.js, bạn có thể sử dụng axios.get() để tìm nạp dữ liệu hình ảnh, khi ở trong trình duyệt, bạn cần sử dụng fetch() và xử lý các chính sách CORS đúng cách.
- Làm cách nào để đảm bảo rằng hình ảnh được thay đổi kích thước chính xác trong các ô Excel?
- Sử dụng row.height Và addImage() có chức năng kiểm soát kích thước của các ô nơi hình ảnh được nhúng, đảm bảo hiển thị phù hợp.
Suy nghĩ cuối cùng về việc nhúng hình ảnh trong Excel
Nhúng hình ảnh trực tiếp vào ô Excel bằng cách sử dụng JavaScript yêu cầu các công cụ và thư viện phù hợp, như ExcelJS, đặc biệt khi làm việc trong môi trường tiện ích mở rộng của Chrome. Nó cho phép bạn tạo các tệp Excel năng động và trực quan hơn.
Thông qua các kỹ thuật được tối ưu hóa như tìm nạp dữ liệu hình ảnh ở định dạng nhị phân và nhúng trực tiếp vào ô, phương pháp này đảm bảo rằng các tệp Excel được tạo của bạn vừa có chức năng vừa hấp dẫn về mặt hình ảnh, đáp ứng nhiều trường hợp sử dụng khác nhau trong phát triển web và hơn thế nữa.
Tài liệu tham khảo và tài nguyên bổ sung
- Để biết thêm tài liệu chi tiết về cách sử dụng ExcelJS để tạo và thao tác với tệp Excel, hãy truy cập Tài liệu chính thức của ExcelJS .
- Để hiểu cách tìm nạp hình ảnh từ URL bằng Axios trong JavaScript, hãy tham khảo Tài liệu Axios .
- Để biết thông tin về cách làm việc với mã hóa hình ảnh base64 trong JavaScript để nhúng vào tệp Excel, hãy xem Tài liệu web MDN: FileReader.readAsDataURL .
- Nếu bạn đang phát triển Tiện ích mở rộng của Chrome và cần hướng dẫn về cách sử dụng API, hãy truy cập Hướng dẫn dành cho nhà phát triển tiện ích mở rộng của Chrome .