使用XLSX上传的Excel的Angular获取标头

时间:2018-08-21 13:28:32

标签: excel angular file-upload import xlsx

我想从上传的Excel文件中获取第一行(名称,电子邮件,手机)作为数组。

  

我正在使用XLSX。

我正在将整个数据放入数组。但是,我只想阅读第一行。因为,

  

我的excel文件很大。

enter image description here

onFileChange(event) { //when user uploads xls file
    const fileList: FileList = event.target.files;
    if (fileList.length > 0) {
      const file: File = fileList[0];
      const reader = new FileReader();
      reader.onload = function (e) {
        const arrayBuffer = this.result,
          data = new Uint8Array(arrayBuffer),
          arr = new Array();
        for (let i = 0; i !== data.length; ++i) {
          arr[i] = String.fromCharCode(data[i]);
        }    
        const bstr = arr.join('');

        const workbook: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });
        const firstSheetName: string = workbook.SheetNames[0];
        const worksheet: XLSX.WorkSheet = workbook.Sheets[firstSheetName];
        // getting all rows
        console.log(XLSX.utils.sheet_to_json(worksheet, { header: 1 })); 
        // I want to get top row only.
        console.log(XLSX.utils.decode_row('A1')); 

      };
      reader.readAsArrayBuffer(file);
    }
  }

4 个答案:

答案 0 :(得分:0)

function get_header_row(sheet) 
{
    var headers = [];
    var range = XLSX.utils.decode_range(sheet['!ref']);
    var C, R = range.s.r; 
     * start in the first row */
    /* walk every column in the range */
    for(C = range.s.c; C <= range.e.c; ++C) 
   {
        var cell = sheet[XLSX.utils.encode_cell({c:C, r:R})] 

        /* find the cell in the first row */
        var hdr = "UNKNOWN " + C; // <-- replace with your desired default 
        if(cell && cell.t) 
         hdr = XLSX.utils.format_cell(cell);

        headers.push(hdr);
    }
    return headers;
}

答案 1 :(得分:0)

我尝试了文件上传,下面是我的步骤以及数据和标头的结果,

这还将在excel工作表中支持多个工作表,

1.npm install --save xlsx
    
2.import * as XLSX from 'xlsx';

3.HTML Code:

<input type="file" (change)="onFileChange($event)">

4.Angular Typescript:

  exceltoJson = {};

  onFileChange(event: any) {
    this.exceltoJson = {};
    let headerJson = {};
    /* wire up file reader */
    const target: DataTransfer = <DataTransfer>(event.target);
    // if (target.files.length !== 1) {
    //   throw new Error('Cannot use multiple files');
    // }
    const reader: FileReader = new FileReader();
    reader.readAsBinaryString(target.files[0]);
    console.log("filename", target.files[0].name);
    this.exceltoJson['filename'] = target.files[0].name;
    reader.onload = (e: any) => {
      /* create workbook */
      const binarystr: string = e.target.result;
      const wb: XLSX.WorkBook = XLSX.read(binarystr, { type: 'binary' });
      for (var i = 0; i < wb.SheetNames.length; ++i) {
        const wsname: string = wb.SheetNames[i];
        const ws: XLSX.WorkSheet = wb.Sheets[wsname];
        const data = XLSX.utils.sheet_to_json(ws); // to get 2d array pass 2nd parameter as object {header: 1}
        this.exceltoJson[`sheet${i + 1}`] = data;
        const headers = this.get_header_row(ws);
        headerJson[`header${i + 1}`] = headers;
        //  console.log("json",headers)
      }
      this.exceltoJson['headers'] = headerJson;
      console.log(this.exceltoJson);
    };
  }

  get_header_row(sheet) {
    var headers = [];
    var range = XLSX.utils.decode_range(sheet['!ref']);
    var C, R = range.s.r; /* start in the first row */
    /* walk every column in the range */
    for (C = range.s.c; C <= range.e.c; ++C) {
      var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */
      // console.log("cell",cell)
      var hdr = "UNKNOWN " + C; // <-- replace with your desired default 
      if (cell && cell.t) {
        hdr = XLSX.utils.format_cell(cell);
        headers.push(hdr);
      }
    }
    return headers;
  }

5.Result
{filename: "uploadedexcel.xlsx", sheet1: Array(212), sheet2: Array(8), headers: {…}}

Results保存上载的excel名称,sheet1和sheet2中的数据,以及sheet1和sheet2中的标头。

上传的excel工作表有sheet1和sheet2。

答案 2 :(得分:0)

// getting all rows
this.data = (XLSX.utils.sheet_to_json(worksheet, { header: 1 })); 
// Fetch the first row
const header = this.data.shift();

答案 3 :(得分:0)

我将此代码用于 Excel 工作表中的单行标题,但我想要一个两行标题。欢迎提出建议。

var Heading =[
  [ "EMPLOYEE","SCORES","COMMENTS"]  
];
  
const myworksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(this.emp ,{skipHeader:true});
XLSX.utils.sheet_add_json(myworksheet,this.emp,{skipHeader:true , origin: 'A2'});
XLSX.utils.sheet_add_aoa(myworksheet, Heading);