nodejs结合xlsx插件读写excel,写入文件后比原文件大10倍左右

发布于 2022-09-12 00:01:01 字数 1324 浏览 19 评论 0

前提条件

有一个压缩后的文件需要传给PHP,但是PHP无法读取。
目前想通过nodejs重新写入一份文件,再传给php

问题分析

nodejs结合xlsx插件可以把数据写入excel。但是有两个问题
    第一: compression: false不压缩写入文件,写入后的文件是源文件的10倍左右的大小。
    第二: compression: true压缩写入文件,PHP依旧无法读取(pass)

以下是文件写入代码

const XLSX = require('xlsx')
const fs = require('fs')
const filePath = './20191015_offres_64711.xlsx'
const outPath = './test.xlsx'
const data = fs.readFileSync(filePath)
const workbook = XLSX.read(data, {
  type: 'buffer'
})
const xlsx_data = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]])
    const ws = XLSX.utils.json_to_sheet(xlsx_data)
    const wb = XLSX.utils.book_new()
    XLSX.utils.book_append_sheet(wb, ws)
    XLSX.writeFile(wb, outPath, {
      compression: false,  // 为true时会压缩文件
      bookSST: true,
      bookType: 'xlsx'
    })

以下是写入后未做任何操作时,文件该有的样子。(注:test.xlsx文件比源文件大10倍左右)。此时test.xslx后台PHP是可以读取的,但是文件莫名的扩大了10倍。

image.png

有一个很神奇的操作。当我分别打开这两个文件,然后ctr+s之后,PHP就可以读取源文件,也可以读取新写入的文件,以下是保存后的文件大小

image.png

上图中的test.xlsx后台PHP也是可以读取的,而且这个文件大小是正常的文件大小。(注:必须手动打开文件,并保存文件

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

染火枫林 2022-09-19 00:01:01

与node-xlsx没关系,与你php读取程序相关
下面是用你的node代码生成,只是改了下生成的文件名,

clipboard.png
source.xlsx内容

clipboard.png
php读取代码

<?php

require "vendor/autoload.php";

// $inputFileName = 'source.xlsx';
$inputFileName = 'compress.xlsx';
$sheetname = 'Sheet1';

/**  1.检测文件类型  **/
$inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($inputFileName);
/**  2.根据类型创建合适的读取器对象  **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);

// 3. 设置读取器选项
// $reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly($sheetname);

class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
{
    public function readCell($column, $row, $worksheetName = '')
    {
        //  选定区域
        if ($row >= 1 && $row <= 7) {
            if (in_array($column, range('A','B'))) {
                return true;
            }
        }
        return false;
    }
}
$filterSubset = new MyReadFilter();
// 使用过滤器
$reader->setReadFilter($filterSubset);

// 4.读取表格表对象
$spreadsheet = $reader->load($inputFileName);

// 5. 得到工作表
$workSheet = $spreadsheet->getActiveSheet();

// 6. 读取表格内容
$cellA1 = $workSheet->getCell('A1');
echo 'Value: ', $cellA1->getValue(), '; Address: ', $cellA1->getCoordinate(), PHP_EOL;

// 7.超出范围不读取
$cellA9 = $workSheet->getCell('A9');
echo 'Value: ', $cellA9->getValue(), '; Address: ', $cellA9->getCoordinate(), PHP_EOL;

输出

Value: age; Address: A1
Value: ; Address: A9
半世蒼涼 2022-09-19 00:01:01

各位大佬都没遇到类似的问题吗

时光无声 2022-09-19 00:01:01

我用的node-xlsx,也碰到了类似的问题。求大佬解惑

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文