Работа с хранилищем GridJs

Работа с хранилищем GridJs

общий файловый процесс

После импорта файла электронной таблицы

GridJs создаст файл кеша с указанным uid в**Config.FileCacheDirectory** папка ,

в форматеAspose.Cells.SaveFormat.Xlsx ,

GridJs также сохраняет все формы/изображения в zip-архив в**Config.PictureCacheDirectory** папку для последующего отображения фигур/изображений в пользовательском интерфейсе клиента.

и после каждой операции обновления в пользовательском интерфейсе клиента,

например, установить значение ячейки, установить стиль ячейки и т. д. ,

Клиентская сторона GridJs запускает действие контроллера для выполнения операции UpdateCell.

В этом действии сохранение обратно в файл кеша произойдет во время метода UpdateCell.

        // post: /GridJs/UpdateCell
        [HttpPost] 
        public ActionResult UpdateCell( )
        {
            string p = HttpContext.Request.Form["p"];
            string uid = HttpContext.Request.Form["uid"];
            GridJsWorkbook gwb = new GridJsWorkbook();
            String ret = gwb.UpdateCell(p, uid);
            return Content(ret, "text/plain", System.Text.Encoding.UTF8);
        }

где на самом деле файл кеша

О. Если мы реализуем GridCacheForStream и установим GridJsWorkbook.CacheImp. например, в приведенном ниже коде мы можем просто поместить и получить файл кеша из**“Д:\темп”**

Config.FileCacheDirectory=@"D:\temp";
GridJsWorkbook.CacheImp=new LocalFileCache();
public class LocalFileCache  : GridCacheForStream
    {
         
        /// <summary>
        /// Implement this method to savecache,save the stream to the cache object with the key id.
        /// </summary>
        /// <param name="s">the source stream </param>
        /// <param name="uid">the key id.</param>
        public override void SaveStream(Stream s, String uid)
        {//make sure the directory exist
            String filepath = Path.Combine(Config.FileCacheDirectory, uid);
            using (FileStream fs = new FileStream(filepath, FileMode.Create)) 
            {
                s.Position = 0;
                s.CopyTo(fs);
            }

        }

        /// <summary>
        /// Implement this method to loadcache with the key uid,return the stream from the cache object.
        /// </summary>
        /// <param name="uid">the key id</param>
        /// <returns>the stream from  the cache</returns>
        public override Stream LoadStream(String uid)
        {//make sure the directory is exist
            String filepath = Path.Combine(Config.FileCacheDirectory, uid);;
            FileStream fs = new FileStream(filepath, FileMode.Open);
            return fs;
        }
		...

B. Если мы не установим GridJsWorkbook.CacheImp,

GridJs создаст и сохранит файл в**Config.FileCacheDirectory** , который является каталогом кеша по умолчанию, который мы можем установить.

как получить обновленный файл результатов

1. указанный uid для файла

Убедитесь, что указанное соответствие сопоставления между файлом и uid,

вы всегда можете получить один и тот же uid для указанного имени файла, а не из случайной генерации.

Например, просто используйте имя файла.

//in controller  
...
        public ActionResult Uidtml(String filename)
        {
 
            return Redirect("~/xspread/uidload.html?file=" + filename + "&uid=" +  Path.GetFileNameWithoutExtension(filename));
        }
 ...
        public ActionResult DetailFileJsonWithUid(string filename,string uid)
        {
            String file = Path.Combine(TestConfig.ListDir, filename);
            GridJsWorkbook wbj = new GridJsWorkbook();
            //check if already in cache
           StringBuilder sb= wbj.GetJsonByUid(uid, filename);
            if(sb==null)
            {
                Workbook wb = new Workbook(file);
                wbj.ImportExcelFile(uid, wb);
                sb = wbj.ExportToJsonStringBuilder(filename);
            }

            return Content(sb.ToString(), "text/plain", System.Text.Encoding.UTF8);
        }

2. синхронизация с работой пользовательского интерфейса клиента

На самом деле для некоторых операций пользовательского интерфейса клиента

например:

переключить активный лист на другой,

изменить положение изображения,

поворот/изменение размера изображения и т. д.

действие UpdateCell не будет запущено.

Таким образом, если мы хотим получить обновленный файл точно так же, как показывает пользовательский интерфейс клиента,

нам нужно выполнить операцию слияния перед сохранением, чтобы синхронизировать эту операцию пользовательского интерфейса клиента.

//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.SaveToXlsx(Path.Combine(Config.FileCacheDirectory, uid));

3. получить файл из кеша

например: в действии загрузки вы можете просто получить его из каталога кеша по uid.

//in controller  

        public async Task<IActionResult> DownloadfromBytes(string uid,string ext)
        {
            byte[] byteArr = await System.IO.File.ReadAllBytesAsync(Path.Combine(Config.FileCacheDirectory, uid) );
            string mimeType = "application/octet-stream";
            return new FileContentResult(byteArr, mimeType)
            {
                FileDownloadName = uid+ ext
            };
        }

Для получения более подробной информации вы можете проверить пример здесь: https://github.com/aspose-cells/Aspose.Cells-for-.NET/tree/master/Examples_GridJs