1.读取excel
const fs = require('fs');
const XLSX = require('xlsx');
const workBook = XLSX.read(fs.readFileSync('xxx.xlsx'), {
type: 'buffer'
})
const sheetName1 = 'xxx'
const sheet = workBook.Sheets[sheetName1] // 读取特定单张表
// 循环遍历多张表
// workBook.SheetNames.forEach((sheetName) => {})
const range = { s: { c: 0, r: 0 }, e: { c: 1, r: 223 } };
const data = XLSX.utils.sheet_to_json(sheet, { range })
fs.writeFileSync('data1.json', JSON.stringify(data, null, 2))
2.导出excel
方案1:xlsx.js
const XLSX = require('xlsx')
const newData = [
['Name', 'Age', 'Gender'],
['Amy', 25, 'Female'],
['Bob', 30, 'Male'],
['Kitty', 16, 'Female']
];
const workBook = XLSX.utils.book_new(); // 新建一个excel
const workSheet = XLSX.utils.aoa_to_sheet(newData); // 新建一张表
XLSX.utils.book_append_sheet(workBook, workSheet, 'Sheet1'); // 将新建的表插入Sheet1
const fileName = 'output.xlsx';
XLSX.writeFile(workBook, fileName); // 导出生成excel
方案2:exceljs
3. docx,xlsx等格式转pdf
方案:先windows安装LibreOffice7.0
使用demo
const toPdf = require('office-to-pdf')
function wordXlsxToPdf() {
let wordFile = './aaa.docx';
let excelFile = './bbb.xlsx';
let pptFile = './ccc.pptx';
return fs.readFile(wordFile, (err, data) => {
if (err) {
console.log(err)
} else {
toPdf(data).then(pdfBuffer => {
fs.readFileSync('./生成的.pdf', pdfBuffer)
}, err => {
console.log('转换失败')
})
}
})
}
4.pdf转成图片
方案1:利用pdfjs-dist和canvas
const Canvas = require('canvas');
const pdfjsLib = require('pdfjs-dist/build/pdf.js');
const assert = require('assert').strict;
class NodeCanvasFactory {
create(width, height) {
assert(width > 0 && height > 0, "Invalid canvas size");
const convas = Canvas.createCanvas(width, height);
const context = canvas.getContext('2d');
return { canvas, context };
}
reset(canvasAndContext, width, height) {
assert(canvasAndContext.canvas, "Canvas is not specified")
assert(width > 0 && height > 0, "Invalid canvas size");
canvasAndContext.canvas.width = width;
canvasAndContext.canvas.height = height;
}
destroy(canvasAndContext) {
assert(canvasAndContext.canvas, "Canvas is not specified.");
canvasAndContext.canvas.width = 0;
canvasAndContext.canvas.height = 0;
canvasAndContext.context = null;
}
}
const CMAP_URL = './node_modules/pdfjs-dist/cmaps/';
const CMAP_PACKED = true;
const defaultPdfPath = './xxxx.pdf';
const pdfToImage = async (pdfPath) => {
const data = new Uint8Array(fs.readFileSync(pdfPath));
const loadingTask = pdfjsLib.getDocument({
data,
cMapUrl: CMAP_URL,
cMapPacked: CMAP_PACKED
})
const doc = await loadingTask.promise;
const totalNums = doc.numPages;
let pageNum = 1;
covertPage(doc, totalNums, pageNum);
}
function covertPage(doc, totalNums, pageNum) {
doc.getPage(pageNum).then((page) => {
const viewport = page.getViewport({ scale: 4.0 });
const canvasFactory = new NodeCanvasFactory();
const canvasAndContext = canvasFactory.create(viewport.width, viewport.height);
const renderContext = {
canvasContext: canvasAndContext.context,
viewport,
canvasFactory
}
page.render(renderContext).then(res => {
const image = canvasAndContext.canvas.toBuffer();
fs.writeFile(`./output/pic-${pageNum}.png`, image, (error) => {
if (error) { conslole.log(error)
} else {
console.log(`Finished coverting ${pageNum} page of PDF file to PNG`)
}
})
if (pageNum < totalNums) {
covertPage(doc, totalNums, pageNum + 1)
} else {
console.log('finished');
}
})
}
}
pdfToImage(defaultPdfPath); // 执行转换
方案2:利用 pdf-image
5. 读取xlsx内容
利用mammoth
const mammoth = require('mammoth')
const fs = require('fs')
const path = require('path')
const filePath = path.join(__dirname, 'document.docx')
// 方法1:获取html格式
mammoth.covertToHtml({ path: 'document.docx' })
.then(result => {
console.log(result)
const html = result.value
const message = result.messages
})
// 方法2:读取文本内容
fs.readFile(filePath, (err, data) => {
if (err) {
console.log(err)
return
}
mammoth.extractRawText({ buffer: data })
.then(result => {
const metadata = result.metadata;
console.log(result.value)
})
.catch(err => {
console.log(err)
})
})
6. 填充xlsx
利用docxtemplater
const PizZip = require('pizzip')
const Docxtemplater = require('docxtemplater')
const fs = require('fs)
const path = require('path')
const content = fs.readFileSync(path.resolve(__dirname, 'input.docx'), 'binary')
const zip = new PizZip(content)
const doc = new Docxtemplater(zip, {
paragraphLoop: true,
linebreaks: true
})
doc.render({
key_1: 'xxx',
key_2: 'xxx'
})
const buf = doc.getZip().generate({
type: 'nodebuffer',
compression: 'DEFLATE'
})
fs.writeFileSync(path.join(__dirname, 'output.docx'), buff)
7.发送邮件
方案:使用nodemailder
const nodemailer = require('nodemailer')
const fs = require('fs')
const htmlstream = fs.createReadStream('./content.html')
const transporter = nodemailer.createTransport({
host: 'smtp.126.com', // 域名,如果是gmail,则为 "smtp.gmail.com"
port: 465,
secure: true,
auth: {
user: 'sendUser@126.com', // 发送者邮箱
pass: 'xxxx' // 授权码,非邮箱登录密码
}
})
// 邮件配置
const mailOption = {
from: 'sendUser@126.com, // 或者 '某某某 sendUser@server.com'
to: '2342342@qq.com,3443890@qq.com', // 多个收件邮箱名以逗号分隔,或者数组
cc: '', // 抄送,格式同to
bcc: '', // 密码抄送
subject: '这是邮件主题', // 主题
text: '这里是一段文字', //
html: htmlstream, // html格式的邮件内容
attachments: [ // 附件
{ filename: '附件.txt', content: 'hello world' },
]
}
transporter.sendMail(mailOption, (err, info) => {
if (err) {
console.log(err)
} else {
console.log('info:', info) // 发送结果相关
}
})
8.图片裁剪
方案:使用sharp
const sharp = require('sharp');
sharp('input.jpg')
.resize(320, 200)
.toFile('output.webp', (err, info) => {});