2013-07-03 37 views
42

Tôi là lập trình viên nodejs. Bây giờ tôi có một bảng dữ liệu mà tôi muốn lưu ở định dạng tệp Excel. Làm thế nào để tôi làm việc này?Làm cách nào để tạo tệp Excel bằng Nodej?

Tôi đã tìm thấy một vài thư viện Node. Nhưng hầu hết trong số đó là Excel Parsers chứ không phải là Excel Writers. Tôi đang sử dụng Linux Server. Do đó cần một cái gì đó có thể chạy trên Linux. Vui lòng cho tôi biết nếu có bất kỳ thư viện hữu ích nào mà bạn biết.

Hoặc có cách nào để tôi có thể chuyển đổi tệp CSV thành tệp xls (theo lập trình) không?

Trả lời

31

excel4node là một duy trì, người tạo tệp Excel gốc được xây dựng từ đặc điểm kỹ thuật chính thức. Nó tương tự, nhưng được duy trì nhiều hơn mxexcel-builder được đề cập trong câu trả lời khác.

// Require library 
var excel = require('excel4node'); 

// Create a new instance of a Workbook class 
var workbook = new excel.Workbook(); 

// Add Worksheets to the workbook 
var worksheet = workbook.addWorksheet('Sheet 1'); 
var worksheet2 = workbook.addWorksheet('Sheet 2'); 

// Create a reusable style 
var style = workbook.createStyle({ 
    font: { 
    color: '#FF0800', 
    size: 12 
    }, 
    numberFormat: '$#,##0.00; ($#,##0.00); -' 
}); 

// Set value of cell A1 to 100 as a number type styled with paramaters of style 
worksheet.cell(1,1).number(100).style(style); 

// Set value of cell B1 to 300 as a number type styled with paramaters of style 
worksheet.cell(1,2).number(200).style(style); 

// Set value of cell C1 to a formula styled with paramaters of style 
worksheet.cell(1,3).formula('A1 + B1').style(style); 

// Set value of cell A2 to 'string' styled with paramaters of style 
worksheet.cell(2,1).string('string').style(style); 

// Set value of cell A3 to true as a boolean type styled with paramaters of style but with an adjustment to the font size. 
worksheet.cell(3,1).bool(true).style(style).style({font: {size: 14}}); 

workbook.write('Excel.xlsx'); 
+0

Chưa thử, nhưng hãy xem Cảm ơn –

+0

Hi mikemaccana, nơi tôi nên sử dụng mã này.i có phải sử dụng mã này trong bộ điều khiển hay bất kỳ mã lược đồ nào. Bạn có thể trả lời câu hỏi này không: https: //stackoverflow.com/questions/44369082/excel-download- is-not-working-in-mean-stack-app/44373532 # 44373532 – Vinoth

+0

Cảm ơn bạn nơi workbook.write lưu tệp? – Raz

36

Tôi chỉ tìm ra một cách đơn giản. Công trình này -

Chỉ cần tạo tệp có Tab làm dấu phân tách (tương tự CSV nhưng thay thế bằng dấu phẩy bằng Tab). Lưu nó với phần mở rộng .XLS. Tệp có thể được mở trong Excel.

Một số mã để giúp đỡ -

var fs = require('fs'); 
var writeStream = fs.createWriteStream("file.xls"); 

var header="Sl No"+"\t"+" Age"+"\t"+"Name"+"\n"; 
var row1 = "0"+"\t"+" 21"+"\t"+"Rob"+"\n"; 
var row2 = "1"+"\t"+" 22"+"\t"+"bob"+"\n"; 

writeStream.write(header); 
writeStream.write(row1); 
writeStream.write(row2); 

writeStream.close(); 

Điều này tạo ra các tập tin trong định dạng file XLS. Nó không hoạt động nếu bạn thử XLSX thay vì XLS.

+2

Tại sao không sử dụng dấu phẩy và tạo tệp CSV bằng nút rồi nhập tệp đó vào Excel? Bằng cách này, Excel có thể thực hiện điều đó và tạo tệp xls/xlsx đúng cách. – BrandonKowalski

+0

Tôi đang cung cấp dịch vụ được lưu trữ cho khách hàng. Sẽ có nhiều tệp được tạo dưới dạng báo cáo mỗi ngày. Tôi không thể yêu cầu khách hàng xuất các tệp này theo cách thủ công mọi lúc. –

+1

Ah gotcha. Sửa chữa gọn gàng bạn tìm thấy tuy nhiên. – BrandonKowalski

7

XLSx trong Office mới chỉ là một tập hợp nén của XML và các tệp khác. Vì vậy, bạn có thể tạo ra và nén nó cho phù hợp.

Bonus: bạn có thể tạo một mẫu rất đẹp với kiểu dáng và vân vân:

  1. Tạo một mẫu trong 'chương trình bảng tính yêu thích của bạn'
  2. Lưu nó như ODS hoặc XLSX
  3. Giải nén nội dung
  4. Sử dụng nó như cơ sở và điền content.xml (hoặc xl/worksheets/sheet1.xml) với dữ liệu của bạn
  5. Zip tất cả trước khi phục vụ

Tuy nhiên tôi thấy ODS (openoffice) nhiều hơn nữa dễ tiếp cận (excel vẫn có thể mở nó), đây là những gì tôi tìm thấy trong content.xml

<table:table-row table:style-name="ro1"> 
    <table:table-cell office:value-type="string" table:style-name="ce1"> 
     <text:p>here be a1</text:p> 
    </table:table-cell> 
    <table:table-cell office:value-type="string" table:style-name="ce1"> 
     <text:p>here is b1</text:p> 
    </table:table-cell> 
    <table:table-cell table:number-columns-repeated="16382"/> 
</table:table-row> 
+0

Học OOXML là một nhiệm vụ không tầm thường. Ngoài ra, sử dụng định dạng tệp khác không phải là câu trả lời cho câu hỏi - điều này sẽ tốt hơn như một – mikemaccana

18

Sử dụng msexcel-builder. Cài đặt nó với:

npm install msexcel-builder 

Sau đó:

// Create a new workbook file in current working-path 
var workbook = excelbuilder.createWorkbook('./', 'sample.xlsx') 

// Create a new worksheet with 10 columns and 12 rows 
var sheet1 = workbook.createSheet('sheet1', 10, 12); 

// Fill some data 
sheet1.set(1, 1, 'I am title'); 
for (var i = 2; i < 5; i++) 
    sheet1.set(i, 1, 'test'+i); 

// Save it 
workbook.save(function(ok){ 
    if (!ok) 
    workbook.cancel(); 
    else 
    console.log('congratulations, your workbook created'); 
}); 
+1

Tôi có thể tập tin kết quả thành đối tượng Response thay vì lưu vào đĩa không? – lvarayut

+0

chắc chắn, hãy thử yêu cầu npm –

+2

Đây là một câu trả lời tuyệt vời (không giống như câu trả lời được đánh dấu hiện tại, không tạo ra tệp Excel ở tất cả) nhưng 'mxexcel-builder' không có bất kỳ bản cập nhật nào trong bốn năm. Tôi đã thêm câu trả lời bằng cách sử dụng' excel4node' bên dưới. – mikemaccana

2

Hoặc - xây dựng dựa trên câu trả lời @Jamaica Geek của, sử dụng Express - để tránh tiết kiệm và đọc một file:

res.attachment('file.xls'); 

    var header="Sl No"+"\t"+" Age"+"\t"+"Name"+"\n"; 
    var row1 = [0,21,'BOB'].join('\t') 
    var row2 = [0,22,'bob'].join('\t'); 

    var c = header + row1 + row2; 
    return res.send(c); 
+1

Rất tiếc, đây không phải là điều tốt ý kiến. dữ liệu của bạn có thể sẽ phá vỡ mã ngây thơ như vậy: Các sự cố bạn sẽ gặp phải khi sử dụng phương pháp trên: 1. các cột bị hỏng khi các ô của bạn bao gồm ký tự trích dẫn hoặc một dòng mới; và 2. các vấn đề mã hóa khi nhập vào Excel trên Mac (bạn phải bao gồm chính xác decodeURIComponent BOM ("% EF% BB% BF") và mã hóa bằng UTF16LE. Tôi khuyên bạn nên sử dụng một thư viện thích hợp thay vì –

1

Sử dụng fs gói chúng ta có thể tạo file excel/CSV từ dữ liệu JSON.

Bước 1: Lưu trữ dữ liệu JSON trong một biến (ở đây là jsn biến).

Bước 2: Tạo biến chuỗi trống (ở đây là dữ liệu).

Bước 3: Nối mỗi tài sản của JSN số liệu biến chuỗi, trong khi phụ đặt '\t' ở giữa 2 tế bào và '\ n' sau khi hoàn thành liên tiếp.

:

var fs = require('fs'); 

var jsn = [{ 
    "name": "Nilesh", 
    "school": "RDTC", 
    "marks": "77" 
    },{ 
    "name": "Sagar", 
    "school": "RC", 
    "marks": "99.99" 
    },{ 
    "name": "Prashant", 
    "school": "Solapur", 
    "marks": "100" 
}]; 

var data=''; 
for (var i = 0; i < jsn.length; i++) { 
    data=data+jsn[i].name+'\t'+jsn[i].school+'\t'+jsn[i].marks+'\n'; 
} 
fs.appendFile('Filename.xls', data, (err) => { 
    if (err) throw err; 
    console.log('File created'); 
}); 

Output

+0

Đây có phải là bản sao của một trong những câu trả lời không? –

+0

Có thể tôi đã mở rộng trước đó nswer. –

2

Bạn nên kiểm tra ExcelJS

trình với các định dạng CSV và XLSX.

Tuyệt vời để đọc/ghi luồng XLSX. Tôi đã sử dụng nó để dòng một XLSX tải đến một đối tượng phản ứng nhanh, về cơ bản như thế này:

app.get('/some/route', function(req, res) { 
    res.writeHead(200, { 
    'Content-Disposition': 'attachment; filename="file.xlsx"', 
    'Transfer-Encoding': 'chunked', 
    'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
    }) 
    var workbook = new Excel.stream.xlsx.WorkbookWriter({ stream: res }) 
    var worksheet = workbook.addWorksheet('some-worksheet') 
    worksheet.addRow(['foo', 'bar']).commit() 
    worksheet.commit() 
    workbook.commit() 
} 

Các công trình lớn cho các tập tin lớn, thực hiện tốt hơn nhiều so với excel4node (có sử dụng bộ nhớ khổng lồ & Node quá trình "ra bộ nhớ "sụp đổ sau gần 5 phút cho một tệp có chứa 4 triệu ô trong 20 trang tính) vì khả năng phát trực tuyến của nó bị hạn chế nhiều hơn (không cho phép" commit() "dữ liệu truy xuất khối ngay sau khi chúng có thể được tạo)

Xem thêm this SO answer.

Các vấn đề liên quan