GridJsストレージで作業する

GridJsストレージで作業する

一般的なファイル処理

スプレッドシートファイルをインポートした後、

GridJsは、Config.getFileCacheDirectory() フォルダ内に指定されたuidのキャッシュファイルを作成します。

Aspose.Cells.SaveFormat.Xlsxの形式で

GridJsは、**Config.getPictureCacheDirectory()**フォルダ内の形状/画像をすべてZIPアーカイブファイルに保存し、後でクライアントUIで表示するために形状/画像を保持します。

クライアントUIでの更新操作後、

たとえば、セル値を設定する、セルスタイルを設定するなど、

GridJsのクライアント側JSはコントローラーアクションをトリガーしてUpdateCell操作を行います。

このアクションでは、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);
		}

    }

キャッシュファイルの実際の場所

A. GridCacheForStreamを実装し、GridJsWorkbook.CacheImpを設定した場合、 たとえば、以下のコードでは、**“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. GridJsWorkbook.CacheImpを設定しない場合、

GridJsは、デフォルトのキャッシュディレクトリである**Config.getFileCacheDirectory()**フォルダ内にファイルを作成して保存します。

更新された結果ファイルの取得方法

1. ファイルの指定されたUID

ファイルとUIDの間の指定されたマッピングの対応を確認してください。

指定されたファイル名の場合、常に同じUIDを取得できます。ランダムな生成ではありません。

たとえば、ファイル名だけを使用しても問題ありません。

//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. クライアントUI操作と同期

実際には、一部のクライアントUI操作に対して、

たとえば:

別のシートにアクティブシートを切り替える、

画像の位置を変更する、

画像の回転/サイズ変更など。

UpdateCellアクションはトリガーされません。

したがって、クライアントUIが表示するように更新されたファイルを取得するには、

これらのクライアントUI操作を同期するために保存アクションの前にマージ操作を実行する必要があります。

//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. キャッシュからファイルURLを取得

たとえば: ダウンロードアクションでは、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+"\"");

詳細情報については、こちらの例をご確認ください: https://github.com/aspose-cells/Aspose.Cells-for-java/tree/master/Examples_GridJs