【问题标题】:JSON to excel conversionJSON到excel的转换
【发布时间】:2020-04-13 12:16:45
【问题描述】:

我正在将 JSON 数据转换为 excel 文件格式。到目前为止,我已经能够使用数据创建一个文件。 我期待在第一行添加要显示的自定义消息(下图),然后数据应显示在带有列标题的文件中。

我参考了这个stackblitz link

我怎样才能做到这一点?


新问题

Missing headers firstName, lastName, email, phone

【问题讨论】:

  • 您使用什么库来创建文件?
  • 据我所知,您需要 1- 添加一行 2- 合并其单元格 3- 将第一个单元格的值设置为您想要的消息/内容 4- 设置其格式以满足您的需要.
  • @MaherFattouh,我猜是XLSX 库。我已经尝试过寻找可能的解决方案,但找不到。

标签: javascript json angular typescript angular-material


【解决方案1】:

我假设当您说 JSON 时,您的意思是从 JSON 文件解析的 Javascript 对象。 在我的例子中是myObject

  1. 我们使用XLSX.utils.json_to_sheet(myObject); 创建一个工作表
  2. 我们在工作表的开头添加一行:XLSX.utils.sheet_add_aoa(myWorkSheet, [["Your Mesage Goes Here"]], { origin: 0 }); 这将在origin 定义的位置插入一个aoa(数组数组)到一个新行。
    • { origin: 0 } 表示第一行
    • { origin: 1 } 表示第二行
    • { origin: -1 } 表示最后一行

在我们的例子中,我们只添加了一个包含以下内容的单元格 (A1):“Your Message Goes Here”

  1. 我们使用 myWorkSheet['!merges'] = [{ s: 'A1', e: 'D1' }]; 合并范围 A1:D1(4 个单元格)中的单元格

    我认为其余的都是不言自明的

这是一个工作示例

myObject = [
  { name: "Moran", role: "back" },
  { name: "Alain", role: "front" },
  { name: "Tony", role: "back" },
  { name: "Mike", role: "back" },
  { name: "Abo", role: "back" },
  { name: "Toni", role: "back" }
];

function exportWS() {
  var myFile = "myFile.xlsx";
  var myWorkSheet = XLSX.utils.json_to_sheet(myObject);
  var myWorkBook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(myWorkBook, myWorkSheet, "myWorkSheet");
  XLSX.writeFile(myWorkBook, myFile);
}
function exportWSPlus() {
  var myFile = "myFilePlus.xlsx";
  var myWorkSheet = XLSX.utils.json_to_sheet(myObject);
  XLSX.utils.sheet_add_aoa(myWorkSheet, [["Your Mesage Goes Here"]], { origin: 0 });
  var merges = myWorkSheet['!merges'] = [{ s: 'A1', e: 'D1' }];
  var myWorkBook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(myWorkBook, myWorkSheet, "myWorkSheet");
  XLSX.writeFile(myWorkBook, myFile);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.3/xlsx.full.min.js"></script>
<button type="button" onclick="exportWS()">Export Worksheet</button>
<button type="button" onclick="exportWSPlus()">Export Worksheet+</button>

如有任何问题,请随时提出。

【讨论】:

  • 我检查了你的代码。不知何故,您的代码解决了我的一个消息问题,但现在缺少列标题。有什么想法吗?
  • 我看到 json 到工作表的转换为列标题分配了第 1 行,这就是消息覆盖它们的原因。
  • 感谢您的帮助,它帮助我部分解决了问题。
  • 对不起,我无法为您提供进一步的帮助,您基本上是创建一个工作表 > 给您写消息并合并单元格 > 将 json 数据添加到工作表中。
【解决方案2】:

我对此进行了很多研究,最后我可以想出一个解决方案。

public exportAsExcelFile(json: Array<object>, excelFileName: string): void {
var worksheet: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet([
  [`${excelFileName}`]]); // message to display
worksheet['!merges'] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 3 } }]; //for merging columns. s : start, e: end, c: column, r: row
XLSX.utils.sheet_add_json(worksheet, json, { origin: "A2" }); //origin for json data
const workbook: XLSX.WorkBook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] };
const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
var range = XLSX.utils.decode_range(worksheet['!ref']);
for (var C = range.s.r; C <= range.e.r; ++C) {
  var address = XLSX.utils.encode_col(C) + "1"; 
  if (!worksheet[address]) continue;
  worksheet[address].v = worksheet[address].v.charAt(0).toUpperCase() + worksheet[address].v.substr(1).toLowerCase();
}
}

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2018-01-15
    • 2016-11-05
    • 1970-01-01
    • 2012-01-27
    • 2011-04-21
    • 2019-12-12
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多