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>
 |