JavaScript có thể tạo tệp Excel không?
Tại Dixie, chúng tôi đang làm việc với dữ liệu tài chính và rất nhiều khách hàng của chúng tôi cần khả năng dễ dàng xuất và làm việc với những dữ liệu này. Công cụ thực tế để thực hiện công việc nâng cao với dữ liệu số là Excel. Điều đó sẽ dễ dàng hỗ trợ, chúng tôi nghĩ. “Hãy xây dựng xuất khẩu CSV và kỳ lân sẽ nhảy múa trên mây,” chúng tôi nói. “Không nhanh như vậy,” Excel hét lên, “bạn biết là không có tiêu chuẩn CSV chung, phải không?” Show
Và địa ngục tan vỡ Tôi chắc chắn đang phóng đại quá mức ở đây, nhưng vấn đề là không chỉ có một định dạng CSV phổ biến được Excel hỗ trợ. Các phiên bản Excel khác nhau sẽ yêu cầu mã hóa khác nhau, dấu phân cách trường, định dạng số, v.v. Chúng tôi nhận thấy rằng người dùng có thể nhập CSV vào bảng tính, chỉ định dấu phân cách, v.v. trong trình hướng dẫn. Nhưng chúng tôi luôn cố gắng làm cho phần mềm của mình hỗ trợ khách hàng, vì vậy chúng tôi muốn dữ liệu của họ chỉ cần một cú nhấp chuột Dựa trên những nhược điểm này, chúng tôi quyết định sử dụng Excel Av. và tạo bản xuất XLSX từ ứng dụng web của chúng tôi Thời gian thực hiện Chúng tôi có một bộ yêu cầu rất đơn giản XLS hoặc XLSXVì chúng tôi đã quyết định rằng CSV không đủ tốt nên XLS hoặc XLSX sẽ là lựa chọn phù hợp. XLSX sẽ thích hợp hơn, vì thông số kỹ thuật của nó có nguồn mở và được hỗ trợ rộng rãi không có máy chủChúng tôi đã tải xuống và hiển thị dữ liệu mà người dùng sắp tải xuống. Do đó, chúng tôi đã quyết định tránh thực hiện một yêu cầu HTTP khác và tìm cách xây dựng tệp XLSX ở phía máy khách Kích thước gói nhỏLàm những việc như thế này trên máy khách có nghĩa là họ phải tải xuống nhiều mã hơn để xây dựng tệp mà họ sắp tải xuống. Mặc dù chúng tôi đang sử dụng tải theo yêu cầu thông qua chia tách mã, nhưng chúng tôi vẫn muốn giữ kích thước gói ở mức thấp Tìm kiếm thư viện JavaScript XLSX, hoạt động trong trình duyệt dường như là một nhiệm vụ đầy thách thức. Chúng tôi đã tìm thấy một thư viện, js-xlsx, quảng cáo hỗ trợ trình duyệt, nhưng đơn giản là nó quá lớn so với nhu cầu của chúng tôi. Nó trông giống như một thư viện vững chắc, nhưng có quá nhiều tính năng hơn mức chúng tôi cần Vì vậy, chúng tôi đã từ bỏ tìm kiếm này và quyết định nghiên cứu khả năng tự xây dựng XLSX một cách đơn giản Nó có vẻ giống như một nhiệm vụ đơn giản. Chúng tôi đang làm việc với một công nghệ mã nguồn mở, vì vậy chúng tôi giả định rằng thông số kỹ thuật sẽ dễ tìm và dễ theo dõi. Chúng tôi nhanh chóng nhận ra rằng chúng tôi đã quá ngây thơ về vấn đề này. XLSX không dễ để tìm thấy một thông số kỹ thuật hoàn chỉnh và dễ hiểu của Chúng tôi đã tìm kiếm nhưng chưa bao giờ thực sự tìm thấy hướng dẫn nhanh về những điều cơ bản của cấu trúc tài liệu XLSX. Vì vậy, sau vài ngày mù mịt, chúng tôi quyết định thiết kế ngược lại cấu trúc XLSX. Khi biết rằng tệp XLSX chỉ đơn giản là một kho lưu trữ zip, chúng tôi đã giải nén tệp đó và xem xét các tệp và thư mục khác nhau Từ quá trình phẫu thuật và thử và sai này, chúng tôi có thể kết luận tệp nào được yêu cầu để tệp XLSX hợp lệ. Nó có thể bị hạn chế chỉ trong 5 tệp
Bạn sẽ không bao giờ tin những gì xảy ra tiếp theo. Chúng tôi đã tìm thấy tài liệu thực tế về cấu trúc XML. Đó là sự thật, nó ở ngay đây. … Microsoft biết tài liệu, họ có tài liệu tốt nhất. Đúng Tại sao tôi viết tất cả những điều này? Chà, chúng tôi nghĩ rằng chúng tôi không thể là những người duy nhất muốn có một cách đơn giản để xuất dữ liệu từ JavaScript sang Excel. Vì vậy, chúng tôi xây dựng một thư viện nhỏ và mã nguồn mở cho nó. Chúng tôi đặt tên nó là zipcelx Nó nhẹ (7kb) và đơn giản Nó có một API. { Dữ liệu trang tính về cơ bản là một ma trận biểu thị các ô trong bảng tính; Chúng tôi hiện hỗ trợ hai loại dữ liệu. chuỗi và số. Chúng là những yếu tố cần thiết cho bảng tính Đóng nhận xét Chúng tôi xây dựng điều này khá nhanh chóng, nhưng chúng tôi khá tự tin với nó. Nhưng đừng ngại để lại bất kỳ đề xuất, nhận xét hoặc câu hỏi nào trong vấn đề GitHub Để viết một tệp import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })6, người ta phải cung cấp const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })0 — một mảng các hàng. Mỗi hàng phải là một mảng ô Mỗi ô phải có một const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })1, một const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })2 và, tùy ý, khác Nếu một ô không có const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })2, thì nó sẽ tự động được phát hiện từ const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })1 hoặc mặc định là const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })5 Một ô trống có thể được đại diện bởi const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })6 hoặc const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })7 const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ] APItrình duyệtimport writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' }) Sử dụng const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })8 để lưu tệp import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })6 từ trình duyệt web Nếu tham số const buffer = await writeXlsxFile(data, { buffer: true })0 không được truyền thì giá trị trả về _______14_______1 sẽ phân giải thành "đốm màu" với nội dung của tệp ____1_______6 Nút. jsconst writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' }) Nếu tham số const buffer = await writeXlsxFile(data, { buffer: true })3 không được truyền, nhưng tham số const buffer = await writeXlsxFile(data, { buffer: true })4 được truyền, thì nó trả về một giá trị const buffer = await writeXlsxFile(data, { buffer: true })5 const buffer = await writeXlsxFile(data, { buffer: true }) Nếu cả tham số const buffer = await writeXlsxFile(data, { buffer: true })3 và tham số const buffer = await writeXlsxFile(data, { buffer: true })4 đều không được truyền, thì nó sẽ trả về một giá trị có thể đọc được là const buffer = await writeXlsxFile(data, { buffer: true })8 const output = fs.createWriteStream(...) const stream = await writeXlsxFile(data) stream.pipe(output)AWS S3 có thể từ chối chấp nhận const buffer = await writeXlsxFile(data, { buffer: true })9 AWS S3 có thể ném const output = fs.createWriteStream(...) const stream = await writeXlsxFile(data) stream.pipe(output)0 await new AWS.S3().putObject({ Bucket: ..., Key: ..., Body: stream, ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }).promise() Lý do là AWS S3 chỉ chấp nhận các luồng có độ dài đã biết và không thể biết trước độ dài của tệp zip Giải pháp thay thế cho AWS SDK v2. viết thư cho const buffer = await writeXlsxFile(data, { buffer: true })5 thay vì một luồng Giải pháp thay thế cho AWS SDK v3. thao tác sử dụng Lược đồNgoài ra, thay vì cung cấp const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })0, người ta có thể cung cấp danh sách const output = fs.createWriteStream(...) const stream = await writeXlsxFile(data) stream.pipe(output)4 và const output = fs.createWriteStream(...) const stream = await writeXlsxFile(data) stream.pipe(output)5 mô tả từng cột const objects = [ { name: 'John Smith', dateOfBirth: new Date(), cost: 1800, paid: true }, { name: 'Alice Brown', dateOfBirth: new Date(), cost: 2600, paid: false } ] const schema = [ { column: 'Name', type: String, value: student => student.name }, { column: 'Date of Birth', type: Date, format: 'mm/dd/yyyy', value: student => student.dateOfBirth }, { column: 'Cost', type: Number, format: '#,##0.00', value: student => student.cost }, { column: 'Paid', type: Boolean, value: student => student.paid } ] Khi sử dụng const output = fs.createWriteStream(...) const stream = await writeXlsxFile(data) stream.pipe(output)5, bắt buộc phải có cột ____2_______2 (không được tự động phát hiện) API lược đồtrình duyệtimport writeXlsxFile from 'write-excel-file' await writeXlsxFile(objects, { schema, fileName: 'file.xlsx' }) Nút. jsconst HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]0 Thông số ôNgoài việc có một const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })2 và một const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })1, mỗi ô (hoặc cột lược đồ) cũng có thể có
Tiêu đề bảngLược đồKhi sử dụng const output = fs.createWriteStream(...) const stream = await writeXlsxFile(data) stream.pipe(output)5, tiêu đề cột có thể được đặt thông qua thuộc tính const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]66 trên mỗi cột. Nó sẽ được in ở đầu bảng const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]1 Nếu thuộc tính const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]66 bị thiếu thì tiêu đề cột sẽ không được in Kiểu tiêu đề bảng mặc định là const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]68 và const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]69 giống như kiểu cột của lược đồ const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]69. Người ta có thể cung cấp kiểu tiêu đề bảng tùy chỉnh bằng cách cung cấp tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]71 const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]2 Dữ liệu di độngKhi không sử dụng lược đồ, người ta có thể in tiêu đề cột bằng cách cung cấp chúng dưới dạng hàng đầu tiên của const writeXlsxFile = require('write-excel-file/node') await writeXlsxFile(data, { columns, // (optional) column widths, etc. filePath: '/path/to/file.xlsx' })0 const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]3 Chiều rộng cộtChiều rộng cột cũng có thể được chỉ định (bằng "ký tự") Lược đồĐể chỉ định chiều rộng cột khi sử dụng const output = fs.createWriteStream(...) const stream = await writeXlsxFile(data) stream.pipe(output)5, hãy đặt const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]74 trên cột giản đồ const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]4 Dữ liệu di độngKhi không sử dụng lược đồ, người ta có thể cung cấp một tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]75 riêng để chỉ định độ rộng của cột const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]5 Nét chữPhông chữ mặc định là const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]76 tại const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]77. Để thay đổi font chữ mặc định, truyền tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]78 và const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]79 khi gọi const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]80 const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]6 Định hướngĐể chỉ định hướng tùy chỉnh (cho tất cả các trang tính), hãy chuyển tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]81 khi gọi const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]80 const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]7 Định dạng ngày thángĐể đặt định dạng ngày mặc định, hãy chuyển tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]28 khi gọi const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]80 const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]8 hàng dínhĐể làm cho một số hàng trên cùng "dính" (Excel gọi chúng là "đóng băng"), hãy chuyển tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]85 khi gọi const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]80 const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]9 Cột dínhĐể làm cho một số cột ở đầu "dính" (Excel gọi chúng là "đóng băng"), hãy chuyển tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]87 khi gọi const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]80 import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })0 Tên trang tínhĐể đặt tên trang tính mặc định, hãy chuyển tham số const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]89 khi gọi const HEADER_ROW = [ { value: 'Name', fontWeight: 'bold' }, { value: 'Date of Birth', fontWeight: 'bold' }, { value: 'Cost', fontWeight: 'bold' }, { value: 'Paid', fontWeight: 'bold' } ] const DATA_ROW_1 = [ // "Name" { type: String, value: 'John Smith' }, // "Date of Birth" { type: Date, value: new Date(), format: 'mm/dd/yyyy' }, // "Cost" { type: Number, value: 1800 }, // "Paid" { type: Boolean, value: true } ] const data = [ HEADER_ROW, DATA_ROW_1, ... ]80 import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })1 Nhiều trang tínhLược đồĐể tạo tệp import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })6 có nhiều trang tính
import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })2 Dữ liệu di độngĐể tạo tệp import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })6 có nhiều trang tính
import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })3 bản đánh máyThư viện này đi kèm với TypeScript "types". Nếu bạn tình cờ tìm thấy bất kỳ lỗi nào trong đó, hãy tạo một vấn đề CDNNgười ta có thể sử dụng bất kỳ dịch vụ CDN npm nào, e. g. giải nén. com hoặc jsdelivr. net import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })4 Người giới thiệuDự án này được lấy cảm hứng từ gói import writeXlsxFile from 'write-excel-file' await writeXlsxFile(data, { columns, // (optional) column widths, etc. fileName: 'file.xlsx' })03 GitHubVào ngày 9 tháng 3 năm 2020, GitHub, Inc. âm thầm cấm tài khoản của tôi (xóa tất cả các kho lưu trữ, các vấn đề và nhận xét của tôi, ngay cả trong các kho lưu trữ riêng tư của chủ nhân của tôi) mà không có bất kỳ thông báo hay lời giải thích nào. Do đó, tất cả các mã nguồn phải được chuyển ngay sang GitLab. Repo GitHub hiện chỉ được sử dụng làm bản sao lưu (bạn cũng có thể gắn dấu sao cho repo ở đó) và repo chính hiện là GitLab. Các vấn đề có thể được báo cáo trong bất kỳ repo nào JavaScript có thể được sử dụng cho Excel không?API JavaScript của Excel có thể tạo và thao tác cấu trúc dữ liệu cũng như trực quan hóa trong Excel . Bảng và biểu đồ là hai trong số các đối tượng được sử dụng phổ biến hơn nhưng API hỗ trợ PivotTable, hình dạng, hình ảnh, v.v.
Làm cách nào để tạo và tải xuống Excel trong JavaScript?hàm DownloadFile(fileName) { // Đặt URL tệp var url = "Tệp/" + tên tệp; //Tạo XMLHTTPRequest var req = new XMLHttpRequest(); Làm cách nào để tạo tệp Excel bằng nút js?Cách tạo Bảng tính Excel từ Nút của bạn. . Bắt đầu với SpreadJS và Node. js Sử dụng gói npm SpreadJS Tải tệp Excel vào nút của bạn. ứng dụng js Thu thập đầu vào của người dùng Điền vào tệp Excel của bạn Xuất nút. js ra Excel Làm cách nào để tạo tệp Excel trong TypeScript?Tạo trang tính
. nhập Excel từ 'exceljs'; . Sổ làm việc(); . addWorksheet('Danh sách các quốc gia'); |