Trabajando con el almacenamiento de GridJs

Trabajando con el almacenamiento de GridJs

el proceso general de archivos

Después de importar un archivo de hoja de cálculo,

GridJs creará un archivo de caché con el uid especificado en la carpeta Config.getFileCacheDirectory() ,

con el formato de Aspose.Cells.SaveFormat.Xlsx ,

GridJs también guardará todas las formas/ímasgenes en un archivo de archivo zip en la carpeta Config.getPictureCacheDirectory() para mostrar las formas/ímasgenes posteriormente en la interfaz de usuario del cliente.

y después de cada operación de actualización en la interfaz de usuario del cliente,

por ejemplo, establecer el valor de celda, establecer el estilo de celda, etc.,

El cliente-side js de GridJs disparará la acción del controlador para realizar la operación de Actualizar celda.

En esta acción, ocurrirá un guardado de nuevo al archivo de caché durante el método UpdateCell.

    @PostMapping("/UpdateCell")
    public ResponseEntity<String> updateCell(HttpServletRequest request) {
        String p = request.getParameter("p");
        String uid = request.getParameter("uid");
        GridJsWorkbook gwb = new GridJsWorkbook();
        String ret;
		try {
			ret = gwb.updateCell(p, uid);
			return new ResponseEntity<>(ret, HttpStatus.OK);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			return new ResponseEntity<>(gwb.errorJson(e.getMessage()), HttpStatus.OK);
		}

    }

¿dónde se encuentra realmente el archivo de caché

A. Si implementamos GridCacheForStream y establecemos GridJsWorkbook.CacheImp. por ejemplo, en el siguiente código, podemos simplemente poner y obtener el archivo de caché desde “D:\temp”

Config.setFileCacheDirectory("D:\temp");
GridJsWorkbook.CacheImp=new LocalFileCache();
public class LocalFileCache extends GridCacheForStream {

	@Override
	public void saveStream(InputStream s, String uid) {
		// make sure the directory is exist
		String filepath = Paths.get(Config.getFileCacheDirectory(), "streamcache", uid.replace('/', '.')).toString();
		try (FileOutputStream fos = new FileOutputStream(filepath.toString())) {
			s.reset(); // Equivalent to s.Position = 0 in C#
			byte[] buffer = new byte[1024];
			int length;
			while ((length = s.read(buffer)) > 0) {
				fos.write(buffer, 0, length);
			}
			fos.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	@Override
	public InputStream loadStream(String uid) {
		String filepath = Paths.get(Config.getFileCacheDirectory(), "streamcache", uid.replace('/', '.')).toString();
		try {
			return new FileInputStream(filepath);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean isExisted(String uid) {
		String filepath = Paths.get(Config.getFileCacheDirectory(), "streamcache", uid.replace('/', '.')).toString();
		return Files.exists(Paths.get(filepath));
	}

	@Override
	public String getFileUrl(String uid) {
		return "/GridJs2/GetFileUseCacheStream?id=" + uid;
	}

}
		...

B. Si no establecemos GridJsWorkbook.CacheImp,

GridJs creará y guardará archivos dentro de la carpeta de Config.getFileCacheDirectory(), que es el directorio de caché predeterminado que podemos configurar.

cómo obtener el archivo de resultado actualizado

1. un uid especificado para el archivo

Asegúrese de tener una correspondencia de mapeo especificada entre el archivo y el uid,

siempre puede obtener el mismo uid para un nombre de archivo específico, no generado aleatoriamente.

Por ejemplo, simplemente usar el nombre del archivo está bien.

//in controller  

     @GetMapping("/DetailStreamJsonWithUid")
    public void detailStreamJsonWithUid(@RequestParam String filename, @RequestParam String uid,HttpServletResponse response) {


        	Path filePath = Paths.get(listDir, filename);
            GridJsWorkbook wbj = new GridJsWorkbook();

            response.setContentType("application/json");
            response.setHeader("Content-Encoding", "gzip");
            try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(response.getOutputStream())) {
                wbj.importExcelFile(filePath.toString());
                wbj.jsonToStream(gzipOutputStream, filename);
            } catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    }

2. sincronizar con la operación de la interfaz de usuario del cliente

En realidad, para algunas operaciones de la interfaz de usuario del cliente,

por ejemplo:

cambiar la hoja activa a otra,

cambiar la posición de la imagen,

rotar/redimensionar la imagen, etc.

la acción UpdateCell no se activará.

Por lo tanto, si queremos obtener el archivo actualizado tal como lo muestra la interfaz de usuario del cliente,

necesitamos realizar una operación de fusión antes de la acción de guardado para sincronizar esas operaciones de la interfaz de usuario del cliente.

//in the js
  function save() {
            if (!xs.buffer.isFinish()) {
              alert('updating is inprogress,please try later');
                return;
            }
            let datas = xs.datas;
            delete datas.history;
            delete datas.search;
            delete datas.images;
            delete datas.shapes;

        var jsondata = {
          sheetname: xs.sheet.data.name,
          actrow: xs.sheet.data.selector.ri,
          actcol: xs.sheet.data.selector.ci,
          datas: xs.getUpdateDatas(),
        };

        const data = {
          p: JSON.stringify(jsondata),
          uid: uniqueid,
        };
		....
		//go on to do ajax post to trigger controller action
//in controller action 
  GridJsWorkbook wb = new GridJsWorkbook();
  wb.mergeExcelFileFromJson(uid, p);
  //after merge do save to chache or to a stream or whaterver you want to save to ,here we just save to cache
  wb.saveToCacheWithFileName(uid,filename,password);

3. obtener la URL del archivo desde caché

por ejemplo: en la acción de descarga, simplemente puedes obtenerlo desde el directorio de caché por uid.

//in controller  

      String fileUrl = null;
			if (GridJsWorkbook.CacheImp != null) {
				fileUrl = GridJsWorkbook.CacheImp.getFileUrl(uid + "/" + filename);
			} else {
				fileUrl = "/GridJs2/GetFile?id=" + uid + "&filename=" + filename;
			}
			return ResponseEntity.ok("\""+fileUrl+"\"");

Para obtener más información detallada, puedes consultar el ejemplo aquí: https://github.com/aspose-cells/Aspose.Cells-for-java/tree/master/Examples_GridJs