在 csv/xlsx 文件中写入图像的正确方法是啥?

Posted

技术标签:

【中文标题】在 csv/xlsx 文件中写入图像的正确方法是啥?【英文标题】:What is the correct way to write an image in a csv/xlsx file?在 csv/xlsx 文件中写入图像的正确方法是什么? 【发布时间】:2016-12-07 06:38:21 【问题描述】:

我正在尝试将图像写入 csv 文件。脚本写入文件,但图像的内容搞砸了。 ����\u0000\u0010JFIF\u0000\u0001\u0001 的长序列。 有人可以指出我在编码中缺少什么还是应该做其他事情?

测试: mkdir so-38711430; cd so-38711430; npm init -y; npm i -S lodash json2csv;

'use strict';

const _ = require('lodash');
const json2csv = require('json2csv');
const fs = require('fs');

let rows = [
    
        'id': 1,
        'name': '12323',
    ,
    
        'id': 2,
        'name': '22323',
    ,
    
        'id': 3,
        'name': '323232',
    ,
    
        'id': 4,
        'name': '24242',
    ,
];

// image path is valid
fs.readFile(`./images/2NTSFr7.jpg`, 'utf-8', (err, data) => 
    _.each(rows, (item) => 
        item.image = data;
    );

    json2csv(
        'data': rows
    , (err, csv) => 
        fs.writeFile('file.csv', csv, (err) => 
            if (err) throw err;

            console.log('file saved');
        );
    );
);

【问题讨论】:

你希望写什么? csv中的实际图像。 您读取的 utf-8 数据看起来像是 JSON.stringify 版本。如果您需要其他内容,请不要将其读取为 utf-8 或不使用基于 JSON 的实用程序。我不相信您可以安全地将未编码的二进制数据写入 csv 文件。 任何可以安全地将数据和图像写入 csv 的替代方案? 我希望 base64 编码成为二进制数据的 csv 格式。 【参考方案1】:

这取决于您如何呈现 CSV/XLSX 文档。

在 CSV 中,如果您在记事本中打开文档,显然您不会看到图像。记事本不会渲染图像,只会渲染文本。正如其他人所说,您可以将其以base64 字符串写入CSV,例如使用node-base64-image 和jQuery-CSV:

import encode, decode from 'node-base64-image'; // ES6

// Get the image as base64 string
var base64string = encode("path/to/img");

// Create an arrays object, to convert to CSV
// Note this is an array of arrays. E.g.,
//   For an array: 
//     array = [ "a", "b", "c" ], 
//   you get the third element by doing:
//     array[2] ( = "c" )
//
//   So, for an array of arrays, i.e., 3 arrays containing 3 elements each:
//     arrayOfArrays = [ [ "a", "b", "c" ],[ "d", "e", "f" ], [ "g", "h", "i" ] ]
//   you get the third element by doing (as above):
//     array[2] ( = [ "g", "h", "i" ] )
//   and the third element of the selected array by doing:
//     array[2][2] ( = "i" )
var csvArrays = [
    [ "Image Name",     "Image base64 Data" ], // Example titles row
    [ "name-for-image", base64string ],        // Example data row
];

// Convert arrays to CSV
var csvData = $.csv.fromArrays(csvArrays); 

// Write the file!
fs.writeFile('csvFile.csv', csvData, (err) => 
    if (err) throw err;
    console.log('It\'s saved!');
);

编辑:然后从 CSV 文件中解码,我们可以得到我们之前保存的 CSV 文件:

import encode, decode from 'node-base64-image'; // ES6

var csvFile = fs.readFile('csvFile.csv');
var csvDataAsArrays = $.csv.toArrays(csvFile);

// Get the second array from the group of arrays, then the second element from that array, hence `[1][1]`
var csvImgAsBase64 = csvDataAsArrays[1][1];
var imgAsData = decode(csvImgAsBase64);

fs.writeFile("img.jpeg", imgData, function() 
    if (err) throw err;
    console.log('It\'s saved!');

在 XLSX 中,您可以根据需要插入图像,然后在 Excel 中打开工作簿以查看图像。以下是使用 Excel for Node 包的方法:

ws.addImage(
    path: './screenshot2.jpeg',
    type: 'picture',
    position: 
        type: 'absoluteAnchor',
        x: '1in',
        y: '2in'
    
);

您也可以相对于单元格定位它:

ws.addImage(
    path: './screenshot1.png',
    type: 'picture',
    position: 
        type: 'twoCellAnchor',
        from: 
            col: 1,
            colOff: 0,
            row: 10,
            rowOff: 0
        ,
        to: 
            col: 4,
            colOff: 0,
            row: 13,
            rowOff: 0
        
    
);

【讨论】:

在base64中写入图像不会渲染图像,对吧?我如何渲染图像?一个愚蠢的笨蛋想要打印出来并站在兄弟会派对前,而不是仅仅将信息覆盖在图像上。 @SwarajGiri 你去!

以上是关于在 csv/xlsx 文件中写入图像的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中同时写入文件(换句话说,写入文件的最快方法是啥)

Python处理Excel文件(csv, xls, xlsx)

用Java将Excel的xls和xlsx文件转换成csv文件的方法, XLS2CSV, XLSX2CSV

在 IE 中写入脚本控制台(console.log)的正确方法是啥?

在 MFC 项目中使用资源文件的正确方法是啥?

检测图像中矩形的最简单*正确*方法是啥?