【问题标题】:Javascript JSON to Excel file downloadJavascript JSON 到 Excel 文件下载
【发布时间】:2015-05-07 17:02:01
【问题描述】:

我有 Json 数据,我需要使用 javascript 将 json 数据转换为 Excel 文件,

参考网址:http://jsfiddle.net/hybrid13i/JXrwM/

我正在使用此代码:

function JSONToTSVConvertor(JSONData, ReportTitle, ShowLabel, myTemplateName){

    //If JSONData is not an object then JSON.parse will parse the JSON string in an Object
    var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;
    var TSV = '';    
    //Set Report title in first row or line
    //TSV += ReportTitle + '\r\n\n';
    //This condition will generate the Label/Header
    if (ShowLabel) {
        var row = "";
        //This loop will extract the label from 1st index of on array
        for (var index in arrData[0]) {
            //Now convert each value to string and tab-seprated
            row += index + '    ';
        }
        row = row.slice(0, -1);
        //append Label row with line break
        TSV += row + '\r\n';
    }

    //1st loop is to extract each row
    for (var i = 0; i < arrData.length; i++) {
        var row = "";
        //2nd loop will extract each column and convert it in string tab-seprated
        for (var index in arrData[i]) {
            row += '"' + arrData[i][index] + '" ';
        }
        row.slice(0, row.length - 1);
        //add a line break after each row
        TSV += row + '\r\n';
    }

    if (TSV == '') {        
        alert("Invalid data");
        return;
    }   
    var blob = new Blob([TSV], {type: "data:text/tsv;charset=utf-8"});
    //Generate a file name

    var fileName = myTemplateName;
    //this will remove the blank-spaces from the title and replace it with an underscore
    fileName += ReportTitle.replace(/ /g,"_"); 
    saveAs(blob, ""+fileName+".tsv");
}

此示例代码适用于 csv 和 tsv 格式。我需要 Excel 格式我不认为有任何想法请帮助我。 请建议一些示例代码。 谢谢...

【问题讨论】:

  • .csv格式已经是excel文件
  • @AndyChen,不完全是,.csv 格式可以在 Excel 中打开,但这并不意味着它是一个 excel 文件..
  • 我正在尝试转换 .xlsx 文件
  • 我错了,是“逗号分隔值”文件,但是可以用excel打开。
  • 如果您不介意使用 API json-xls API

标签: javascript json


【解决方案1】:

如上所述,CSV 是 excel 文件本身。但是,在许多语言环境中,上面脚本生成的 csv 会被错误地打开,其中 excel 会将所有内容放入 1 个单元格中。对原始脚本的小修改有帮助:只需将标题替换为“sep=”。

var CSV = 'sep=,' + '\r\n\n';

在此处进行更改的工作示例:https://jsfiddle.net/1ecj1rtz/

花了一些时间来解决这个问题,因此回答旧线程以帮助其他人节省一些时间。

【讨论】:

  • 此代码在 IE 中不起作用。能否请您告诉我这段代码如何在 IE 中运行。
  • 为避免在 excel 中自动进行数字和日期转换,您可以在第二个循环中使用 row += '"=""' + arrData[i][index] + '""",';
【解决方案2】:

我创建了一个类来将 json 数据导出到 excel 文件。如果在我的代码中进行一些富有成效的编辑,我会很高兴。

只需在你的 JS 库中添加类并调用:

var myTestXML = new myExcelXML(myJsonArray);
myTestXML.downLoad();

我的 myExcelXML 类:

let myExcelXML = (function() {
    let Workbook, WorkbookStart = '<?xml version="1.0"?><ss:Workbook  xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">';
    const WorkbookEnd = '</ss:Workbook>';
    let fs, SheetName = 'SHEET 1',
        styleID = 1, columnWidth = 80,
        fileName = "Employee_List", uri, link;

    class myExcelXML {
        constructor(o) {
            let respArray = JSON.parse(o);
            let finalDataArray = [];

            for (let i = 0; i < respArray.length; i++) {
                finalDataArray.push(flatten(respArray[i]));
            }

            let s = JSON.stringify(finalDataArray);
            fs = s.replace(/&/gi, '&amp;');
        }

        downLoad() {
            const Worksheet = myXMLWorkSheet(SheetName, fs);

            WorkbookStart += myXMLStyles(styleID);

            Workbook = WorkbookStart + Worksheet + WorkbookEnd;

            uri = 'data:text/xls;charset=utf-8,' + encodeURIComponent(Workbook);
            link = document.createElement("a");
            link.href = uri;
            link.style = "visibility:hidden";
            link.download = fileName + ".xls";

            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }

        get fileName() {
            return fileName;
        }

        set fileName(n) {
            fileName = n;
        }

        get SheetName() {
            return SheetName;
        }

        set SheetName(n) {
            SheetName = n;
        }

        get styleID() {
            return styleID;
        }

        set styleID(n) {
            styleID = n;
        }
    }

    const myXMLStyles = function(id) {
        let Styles = '<ss:Styles><ss:Style ss:ID="' + id + '"><ss:Font ss:Bold="1"/></ss:Style></ss:Styles>';

        return Styles;
    }

    const myXMLWorkSheet = function(name, o) {
        const Table = myXMLTable(o);
        let WorksheetStart = '<ss:Worksheet ss:Name="' + name + '">';
        const WorksheetEnd = '</ss:Worksheet>';

        return WorksheetStart + Table + WorksheetEnd;
    }

    const myXMLTable = function(o) {
        let TableStart = '<ss:Table>';
        const TableEnd = '</ss:Table>';

        const tableData = JSON.parse(o);

        if (tableData.length > 0) {
            const columnHeader = Object.keys(tableData[0]);
            let rowData;
            for (let i = 0; i < columnHeader.length; i++) {
                TableStart += myXMLColumn(columnWidth);

            }
            for (let j = 0; j < tableData.length; j++) {
                rowData += myXMLRow(tableData[j], columnHeader);
            }
            TableStart += myXMLHead(1, columnHeader);
            TableStart += rowData;
        }

        return TableStart + TableEnd;
    }

    const myXMLColumn = function(w) {
        return '<ss:Column ss:AutoFitWidth="0" ss:Width="' + w + '"/>';
    }


    const myXMLHead = function(id, h) {
        let HeadStart = '<ss:Row ss:StyleID="' + id + '">';
        const HeadEnd = '</ss:Row>';

        for (let i = 0; i < h.length; i++) {
            const Cell = myXMLCell(h[i].toUpperCase());
            HeadStart += Cell;
        }

        return HeadStart + HeadEnd;
    }

    const myXMLRow = function(r, h) {
        let RowStart = '<ss:Row>';
        const RowEnd = '</ss:Row>';
        for (let i = 0; i < h.length; i++) {
            const Cell = myXMLCell(r[h[i]]);
            RowStart += Cell;
        }

        return RowStart + RowEnd;
    }

    const myXMLCell = function(n) {
        let CellStart = '<ss:Cell>';
        const CellEnd = '</ss:Cell>';

        const Data = myXMLData(n);
        CellStart += Data;

        return CellStart + CellEnd;
    }

    const myXMLData = function(d) {
        let DataStart = '<ss:Data ss:Type="String">';
        const DataEnd = '</ss:Data>';

        return DataStart + d + DataEnd;
    }

    const flatten = function(obj) {
        var obj1 = JSON.parse(JSON.stringify(obj));
        const obj2 = JSON.parse(JSON.stringify(obj));
        if (typeof obj === 'object') {
            for (var k1 in obj2) {
                if (obj2.hasOwnProperty(k1)) {
                    if (typeof obj2[k1] === 'object' && obj2[k1] !== null) {
                        delete obj1[k1]
                        for (var k2 in obj2[k1]) {
                            if (obj2[k1].hasOwnProperty(k2)) {
                                obj1[k1 + '-' + k2] = obj2[k1][k2];
                            }
                        }
                    }
                }
            }
            var hasObject = false;
            for (var key in obj1) {
                if (obj1.hasOwnProperty(key)) {
                    if (typeof obj1[key] === 'object' && obj1[key] !== null) {
                        hasObject = true;
                    }
                }
            }
            if (hasObject) {
                return flatten(obj1);
            } else {
                return obj1;
            }
        } else {
            return obj1;
        }
    }

    return myExcelXML;
})();

【讨论】:

  • 如何将 json 文件保存为 xlsx 格式。我应该在其中修改什么
  • @aneesh-narayanan 将 myJsonArray 变量替换为您的 json 数据变量。
  • 没有。这个以“xls”格式保存文件。我希望它保存为“xlsx”。我认为这两种格式都有不同的属性。
  • 你知道为什么我只能导出一次吗?第二次导出时,文件打开时提示“文件已损坏”
  • 是否可以在node js中使用这段代码来创建和存储excel文件服务器端
【解决方案3】:

我已经使用以下代码Javascript JSON到Excel或CSV文件下载

仅更改文件扩展名(reports.xlsx 或 reports.CSV)

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.13.1/xlsx.full.min.js"></script> 
<script>
    function ExportData()
    {
            filename='reports.xlsx';
       data=[{Market: "IN", New Arrivals: "6", Upcoming Appointments: "2", Pending - 1st Attempt: "4"},
            {Market: "KS/MO", New Arrivals: "4", Upcoming Appointments: "4", Pending - 1st Attempt: "2"},
            {Market: "KS/MO", New Arrivals: "4", Upcoming Appointments: "4", Pending - 1st Attempt: "2"},
            {Market: "KS/MO", New Arrivals: "4", Upcoming Appointments: "4", Pending - 1st Attempt: "2"}]
        var ws = XLSX.utils.json_to_sheet(data);
        var wb = XLSX.utils.book_new();
        XLSX.utils.book_append_sheet(wb, ws, "People");
        XLSX.writeFile(wb,filename);
     }
</script>

【讨论】:

  • 那些使用 React 的人可以遵循相同的实现通过使用 npm install --save xlsx 安装这个库,然后将其导入为 import XLSX from "xlsx"
  • 我在 Vue.js 项目中使用了它,它也在那里工作。
  • 如果某个响应缺少其中一个键,它是否仍会像这样工作:data= [{Market: "IN", New Arrivals: "6", Upcoming Appointments: "2", Pending - 1st尝试:“4”},{市场:“KS/MO”,新品:“4”,待定 - 第一次尝试:“2”},
【解决方案4】:

我知道回答有点晚了,但我找到了一个不错的 angular 库,它可以自己完成所有艰苦的工作。

GITHUB:ngJsonExportExcel

库直接下载:Download

文件保护 JS:Download

如何使用?

  1. 在您的应用中包含该模块

var myapp = angular.module('myapp', ['ngJsonExportExcel'])

  1. 添加导出按钮并使用ng-json-export-excel 指令并将数据传递到指令中

ng-json-export-excel : 指令名

data : 就是要导出的数据(JSON)

报告字段:

传递列名和 JSON 中存在的键,例如 customer_name": "客户名称"

HTML

<button ng-json-export-excel data="dataList" report-fields="{'uesr.username': 'Heder 1', keyjson2: 'Header 2', keyjson3: 'Head 3'}" filename =" 'export-excel' " separator="," class="css-class"></button>

【讨论】:

    【解决方案5】:

    Excel 是一种非常复杂的格式,有很多版本。如果你真的需要这样做,我会调查其他人编写的一些 JavaScript 库。在 Google 上搜索“javascript excel writer”以查看一些示例。

    【讨论】:

      【解决方案6】:

      此代码 sn-p 将 node.js 与 excel4node 和 express 模块一起使用,以便使用 Javascript 将 JSON 数据转换为 Excel 文件并将其发送到客户端。

      const xl = require('excel4node');
      const express = require('express');
      const app = express();
      
      var json = [{"Vehicle":"BMW","Date":"30, Jul 2013 09:24 AM","Location":"Hauz Khas, Enclave, New Delhi, Delhi, India","Speed":42},{"Vehicle":"Honda CBR","Date":"30, Jul 2013 12:00 AM","Location":"Military Road,  West Bengal 734013,  India","Speed":0},{"Vehicle":"Supra","Date":"30, Jul 2013 07:53 AM","Location":"Sec-45, St. Angel's School, Gurgaon, Haryana, India","Speed":58},{"Vehicle":"Land Cruiser","Date":"30, Jul 2013 09:35 AM","Location":"DLF Phase I, Marble Market, Gurgaon, Haryana, India","Speed":83},{"Vehicle":"Suzuki Swift","Date":"30, Jul 2013 12:02 AM","Location":"Behind Central Bank RO, Ram Krishna Rd by-lane, Siliguri, West Bengal, India","Speed":0},{"Vehicle":"Honda Civic","Date":"30, Jul 2013 12:00 AM","Location":"Behind Central Bank RO, Ram Krishna Rd by-lane, Siliguri, West Bengal, India","Speed":0},{"Vehicle":"Honda Accord","Date":"30, Jul 2013 11:05 AM","Location":"DLF Phase IV, Super Mart 1, Gurgaon, Haryana, India","Speed":71}]
      
      const createSheet = () => {
      
        return new Promise(resolve => {
      
      // setup workbook and sheet
      var wb = new xl.Workbook();
      
      var ws = wb.addWorksheet('Sheet');
      
      // Add a title row
      
      ws.cell(1, 1)
        .string('Vehicle')
      
      ws.cell(1, 2)
        .string('Date')
      
      ws.cell(1, 3)
        .string('Location')
      
      ws.cell(1, 4)
        .string('Speed')
      
      // add data from json
      
      for (let i = 0; i < json.length; i++) {
      
        let row = i + 2
      
        ws.cell(row, 1)
          .string(json[i].Vehicle)
      
        ws.cell(row, 2)
          .date(json[i].Date)
      
        ws.cell(row, 3)
          .string(json[i].Location)
      
        ws.cell(row, 4)
          .number(json[i].Speed)
      }
      
      resolve( wb )
      
        })
      }
      
      app.get('/excel', function (req, res) {
      
        createSheet().then( file => {
      file.write('ExcelFile.xlsx', res);
        })
      
      });
      
      app.listen(3040, function () {
        console.log('Excel app listening on port 3040');
      });
      

      【讨论】:

      • 请解释这是如何回答问题的
      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多