2016-08-02 46 views
1

我想写一个图像,到一个csv文件。脚本写入文件,但图像的内容混乱。 长序列����\u0000\u0010JFIF\u0000\u0001\u0001。 有人可以指出我错过了什么编码,或者我应该做些别的?在csv/xlsx文件中写入图像的正确方法是什么?

测试: 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'); 
     }); 
    }); 
}); 
+0

什么是你期待写? – Matt

+0

csv中的实际图像。 –

+0

它看起来像是你阅读的utf-8数据的'JSON.stringify'版本。如果你需要别的东西,不要把它作为utf-8读取,也不要使用基于JSON的工具。我不相信你可以安全地将非编码的二进制数据写入csv文件。 – Matt

回答

1

这取决于你是如何呈现的CSV/XLSX文件。

在CSV中,如果您在NotePad中打开文档,显然您将看不到图像。记事本不会渲染图像,只是文字。正如其他人所说,你可以使用node-base64-imagejQuery-CSV它写在base64字符串到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 
     } 
    } 
}); 
+0

在base64中写入图像不会渲染图像,对吧?我如何渲染图像?愚蠢的愚蠢想要打印出来,站在一个兄弟会的面前,而不是仅仅叠加图像上的信息。 –

+0

我会更新我的答案,如何解码它。 –

+0

@SwarajGiri你走了! –

相关问题