69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| 
								 | 
							
								<template>
							 | 
						||
| 
								 | 
							
								  <q-page class="row items-center justify-evenly">
							 | 
						||
| 
								 | 
							
								    <q-table :rows="todos" />
							 | 
						||
| 
								 | 
							
								    <q-btn-group>
							 | 
						||
| 
								 | 
							
								      <q-file v-model="file" label="Load File" filled label-color="orange" @input="updateFile"/>
							 | 
						||
| 
								 | 
							
								      <q-btn label="Save File" @click="saveFile" />
							 | 
						||
| 
								 | 
							
								    </q-btn-group>
							 | 
						||
| 
								 | 
							
								  </q-page>
							 | 
						||
| 
								 | 
							
								</template>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<script setup lang="ts">
							 | 
						||
| 
								 | 
							
								import { ref } from 'vue';
							 | 
						||
| 
								 | 
							
								import { read, write, utils } from 'xlsx';
							 | 
						||
| 
								 | 
							
								import { useQuasar } from 'quasar';
							 | 
						||
| 
								 | 
							
								import type { Todo } from 'components/models';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const $q = useQuasar();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const todos = ref<Todo[]>([
							 | 
						||
| 
								 | 
							
								  { id: 1, content: 'ct1' },
							 | 
						||
| 
								 | 
							
								  { id: 2, content: 'ct2' },
							 | 
						||
| 
								 | 
							
								  { id: 3, content: 'ct3' },
							 | 
						||
| 
								 | 
							
								  { id: 4, content: 'ct4' },
							 | 
						||
| 
								 | 
							
								  { id: 5, content: 'ct5' }
							 | 
						||
| 
								 | 
							
								]);
							 | 
						||
| 
								 | 
							
								const file = ref<File>();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function dialogerr(e: any) { $q.dialog({title: "Error!", message: e?.message || String(e)}); }
							 | 
						||
| 
								 | 
							
								function saveFile() {
							 | 
						||
| 
								 | 
							
								  /* generate workbook from state */
							 | 
						||
| 
								 | 
							
								  const ws = utils.json_to_sheet(todos.value);
							 | 
						||
| 
								 | 
							
								  const wb = utils.book_new(ws, "SheetJSQuasar");
							 | 
						||
| 
								 | 
							
								  const u8: Uint8Array = write(wb, {bookType: "xlsx", type: "buffer"});
							 | 
						||
| 
								 | 
							
								  const dir: string = $q.cordova.file.documentsDirectory || $q.cordova.file.externalApplicationStorageDirectory;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* save to file */
							 | 
						||
| 
								 | 
							
								  window.requestFileSystem(window.PERSISTENT, 0, function(fs) {
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      fs.root.getFile("SheetJSQuasar.xlsx", {create: true}, entry => {
							 | 
						||
| 
								 | 
							
								        const msg = `File stored at ${dir} ${entry.fullPath}`;
							 | 
						||
| 
								 | 
							
								        entry.createWriter(writer => {
							 | 
						||
| 
								 | 
							
								          try {
							 | 
						||
| 
								 | 
							
								            const data = new Blob([u8], {type: "application/vnd.ms-excel"});
							 | 
						||
| 
								 | 
							
								            writer.onwriteend = () => {
							 | 
						||
| 
								 | 
							
								              try {
							 | 
						||
| 
								 | 
							
								                $q.dialog({title: "Success!", message: msg});
							 | 
						||
| 
								 | 
							
								              } catch(e) { dialogerr(e); }
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								            writer.onerror = dialogerr;
							 | 
						||
| 
								 | 
							
								            writer.write(data);
							 | 
						||
| 
								 | 
							
								          } catch(e) { dialogerr(e); }
							 | 
						||
| 
								 | 
							
								        }, dialogerr);
							 | 
						||
| 
								 | 
							
								      }, dialogerr);
							 | 
						||
| 
								 | 
							
								    } catch(e) { dialogerr(e) }
							 | 
						||
| 
								 | 
							
								  }, dialogerr);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								async function updateFile(v: Event) {
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    const files = (v.target as HTMLInputElement).files;
							 | 
						||
| 
								 | 
							
								    if(!files || files.length == 0 || !files[0]) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const wb = read(await files[0].arrayBuffer());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const data = utils.sheet_to_json<any>(wb.Sheets[wb.SheetNames[0]!]!);
							 | 
						||
| 
								 | 
							
								    todos.value = data.map(row => ({id: row.Index, content: row.Name}));
							 | 
						||
| 
								 | 
							
								  } catch(e) { dialogerr(e); }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</script>
							 |