I am learned how to use material ui in angular.
i want to upload csv file to web with metrial ui.
i really like material ui so i want to import a csv with material table layout
in the following code the content is already done with https://fonts.google.com/specimen/Lato
import excel or csv and show data in table view
I tried to put the following steps in material ui
1.Toolbar overview
2.Menu Please upload CSV file or Excel file
3.Please upload file button
4.Material table
Until the third step I can.
but in 4step send an Error
templateUrl: './app.component.html',
Error occurs in the template of component AppComponent.
Do I have to import something in displayedColumns ?
Can this script be made in material ui?
Sorry for the beginner question, can you help me with this question?
-------Before fonts Lato---------
import excel or csv and show data in table view
-------After angular ui import---------
app.module.ts
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatTableModule } from '@angular/material/table';
import { MatToolbarModule } from '@angular/material/toolbar';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
@NgModule({
imports: [BrowserModule, FormsModule,MatToolbarModule,MatIconModule,MatButtonModule,MatMenuModule,MatTableModule],
declarations: [ AppComponent],
bootstrap: [ AppComponent ]
})
export class AppModule { }
app.component.ts
import * as XLSX from 'xlsx';
import { Component, VERSION } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css',],
})
export class AppComponent {
name = 'Angular ' + VERSION.major;
public tableData: any;
public tableTitle: any;
public customPagination = 1;
public recordsPerPage = 10;
public tableRecords = [];
public pageStartCount = 0;
public pageEndCount = 10;
public totalPageCount = 0;
public currentPage = 0;
public uploadData(e) {
console.log(e.target.files[0]);
/* wire up file reader */
const target: DataTransfer = <DataTransfer>(<unknown>e.target);
if (target.files.length !== 1) {
throw new Error('Cannot use multiple files');
}
const reader: FileReader = new FileReader();
reader.readAsBinaryString(target.files[0]);
reader.onload = (e: any) => {
/* create workbook */
const binarystr: string = e.target.result;
const wb: XLSX.WorkBook = XLSX.read(binarystr, { type: 'binary' });
/* selected the first sheet */
const wsname: string = wb.SheetNames[0];
const ws: XLSX.WorkSheet = wb.Sheets[wsname];
/* save data */
const data = XLSX.utils.sheet_to_json(ws); // to get 2d array pass 2nd parameter as object {header: 1}
console.log(data); // Data will be logged in array format containing objects
this.tableData = data;
this.tableTitle = Object.keys(this.tableData[0]);
this.tableRecords = this.tableData.slice(
this.pageStartCount,
this.pageEndCount
);
this.totalPageCount = this.tableData.length / this.recordsPerPage;
};
}
onPageChange() {
this.pageStartCount = this.currentPage * this.recordsPerPage;
this.pageEndCount = this.pageStartCount + this.recordsPerPage;
this.tableRecords = this.tableData.slice(
this.pageStartCount,
this.pageEndCount
);
}
}
app.component.html
<!--Toolbar overview add-->
<p>
<mat-toolbar color="primary">
<button mat-icon-button class="example-icon" aria-label="Example icon-button with menu icon">
<mat-icon>menu</mat-icon>
</button>
<span>My App</span>
<span class="example-spacer"></span>
<button mat-icon-button class="example-icon favorite-icon" aria-label="Example icon-button with heart icon">
<mat-icon>favorite</mat-icon>
</button>
<button mat-icon-button class="example-icon" aria-label="Example icon-button with share icon">
<mat-icon>share</mat-icon>
</button>
</mat-toolbar>
</p>
<section>
<!--Menu Please upload CSV file or Excel file-->
<button mat-button [matMenuTriggerFor]="menu">Please upload CSV file or Excel file</button>
<mat-menu #menu="matMenu">
</mat-menu>
<!--Please upload file button-->
<div class="example-button-row">
<button mat-raised-button color="primary">Please upload file</button>
</div>
</section>
<!--Material table>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
<!--- Note that these columns can be defined in any order.
The actual rendered columns are set as a property on the row definition" -->
<!-- Position Column -->
<ng-container matColumnDef="position">
<th mat-header-cell *matHeaderCellDef> No. </th>
<td mat-cell *matCellDef="let element"> {{element.position}} </td>
</ng-container>
<!-- Name Column -->
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let element"> {{element.name}} </td>
</ng-container>
<!-- Weight Column -->
<ng-container matColumnDef="weight">
<th mat-header-cell *matHeaderCellDef> Weight </th>
<td mat-cell *matCellDef="let element"> {{element.weight}} </td>
</ng-container>
<!-- Symbol Column -->
<ng-container matColumnDef="symbol">
<th mat-header-cell *matHeaderCellDef> Symbol </th>
<td mat-cell *matCellDef="let element"> {{element.symbol}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
app.component.css
p {
font-family: Lato;
}
.table,.container{
margin-top:20px;
}
.btn{
margin-right:20px;
margin-top: 20px;
}