title: Exceljs : iterate each cell of each row and column
body: <p>I want to put thick border in all my cells. this is an angular project, I am using typescript.</p>
  
  <p>I can do this for 1 cell,</p>
  
  <pre><code>worksheet.getCell('A1').border = {
    top: { style: 'thick' },
    left: { style: 'thick' },
    bottom: { style: 'thick' },
    right: { style: 'thick' }
  };
  </code></pre>
  
  <p>But I want to do something like 2 nested for loops . For each row , make each cell thick</p>
  
  <p>Here is I tried : <strong>app.component.ts</strong></p>
  
  <pre><code>import { Component, OnInit } from '@angular/core';
  import { DataService } from '../data.service';
  import * as jspdf from 'jspdf';
  import html2canvas from 'html2canvas';
  // import * as XLSX from 'xlsx';
  
  import * as ExcelJS from 'exceljs';
  import * as FileSaver from 'file-saver';
  
  import { ViewChild, ElementRef } from '@angular/core';
  
  
  
  @Component({
    selector: 'app-items-report',
    templateUrl: './items-report.component.html',
    styleUrls: ['./items-report.component.css']
  })
  export class ItemsReportComponent implements OnInit {
    purchases: any;
    constructor(private dataService: DataService) {
      this.GetPurchases();
    }
  
    ngOnInit(): void {
    }
  
    async GetPurchases() {
      const response = await this.dataService.GetPurchases();
      const dataService = await response.json();
      this.purchases = dataService;
    }
  
    downloadPDF() {
      const data = document.getElementById('purchaseTable');  // Id of the table
      html2canvas(data).then(canvas =&gt; {
        // Few necessary setting options
        const imgWidth = 208;
        const pageHeight = 295;
        const imgHeight = canvas.height * imgWidth / canvas.width;
        const heightLeft = imgHeight;
  
        const contentDataURL = canvas.toDataURL('image/png');
        // Your 1st parameter (landscape [l] or portrait [p]) determines what becomes the width and the height.
        const pdf = new jspdf('p', 'mm', 'a4'); // A4 size page of PDF
        const position = 0;
        /* addImage explained below:
        param 1 -&gt; image in code format
        param 2 -&gt; type of the image. SVG not supported. needs to be either PNG or JPEG.
        all params are specified in integer
        param 3 -&gt; X axis margin from left
        param 4 -&gt; Y axis margin from top
        param 5 -&gt; width of the image
        param 6 -&gt; height of the image
        */
        // pdf.addImage(contentDataURL, 'PNG', 0, position, imgWidth, imgHeight);
        // pdf.addImage(contentDataURL, 'PNG', 18, 30, imgWidth - 17, imgHeight);
        pdf.addImage(contentDataURL, 'PNG', 18, 30, imgWidth - 21, imgHeight);
  
        pdf.save('MYPdf.pdf'); // Generated PDF
      });
    }
    downloadExcel() {
  
  
      const date = new Date().toISOString().slice(0, 10).split('-').reverse().join('/');
      console.log(date);
  
  
  
      const workbook = new ExcelJS.Workbook();
      const worksheet = workbook.addWorksheet('My Sheet');
  
      worksheet.columns = [
        { header: 'Id', key: 'id', width: 10},
        { header: 'Name', key: 'name', width: 32 },
        { header: 'Quantity', key: 'quantity', width: 15 },
        { header: 'Rate', key: 'rate', width: 15 },
        { header: 'Date', key: 'date', width: 15 },
        { header: 'Total', key: 'total', width: 15 }
      ];
  
  
  
  
      for (const purchase of this.purchases) {
        worksheet.addRow({
          id: purchase.item_id ,
          date: purchase.item_purchase_date.toString().slice(0, 10).split('-').reverse().join('/'),
          name: purchase.item_name,
          quantity: purchase.item_quantity,
          rate: purchase.item_rate,
          total: purchase.item_rate * purchase.item_quantity
         })
        .alignment = { horizontal: 'left' };
      }
  
      worksheet.getRow(1).font = { bold: true };
  
  // Iterate over all rows (including empty rows) in a worksheet
  worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) =&gt; {
    console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
    row.eachCell({ includeEmpty: true }, (cell, rowNumber) =&gt; {
      // ...please make my cell thick here
      // i cant no longer write a1 or b1
      // i need to access all cells - including empty cells
  
    });
  });
  
  
  
  
     book.xlsx.readFile('export.xlsx');
  
  
  }
  </code></pre>
  
  <p>I need to make each of my cells thick, inside for loop. So please help me how to access each cell in a loop without writing a1 or b1</p>