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

前提条件

有一个压缩后的文件需要传给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也是可以读取的,而且这个文件大小是正常的文件大小。(注:必须手动打开文件,并保存文件

阅读 4.9k
3 个回答

与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

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

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题