找回密码
 立即注册

QQ登录

只需一步,快速开始

[已处理] 跨sheet计算cell值

seasky083
银牌会员   /  发表于:2015-3-30 09:44:00
11#
$(function () {
     setTimeout(function () {
         document.getElementById('FpSpread_Report').Update();
     }, 90);
});
现在没办法,只能前台加载完成之后刷新一次,但是会影响效果和效率
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-3-30 14:16:00
12#
回复 11楼seasky083的帖子

经产品组确认,该问题是 Spread 产品bug,在后续版本中会修复。
您9#中描述的问题我这边没有重现,能否提供Demo过来,我们这边重现后看能否提供给您 work around 暂时解决使用问题。
回复 使用道具 举报
seasky083
银牌会员   /  发表于:2015-3-30 15:18:00
13#
SpreadTest.rar (505.21 KB, 下载次数: 281)
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-3-30 17:42:00
14#
回复 13楼seasky083的帖子

抱歉,当前这个代码逻辑不是十分清楚,目前运行起来后Sheet1 的Cell【0,0】中仅仅设置了文本,并没有公式?请问如何重现问题?
回复 使用道具 举报
seasky083
银牌会员   /  发表于:2015-3-31 08:23:00
15#
如果你跟代码的话就可以看到,我里面用了try catch,代码逻辑是这样的,把excel中单元格的内容先放到dictionary中(我这里需要分解公式,到数据库中提取数据
这边没有提取数据,直接复制到Formula中了),然后在
//将对应!公式替换掉
            for (int k = 0; k < _SheetListNon.Count; k++)
            {
               
                foreach (KeyValuePair<string, string> cellNon in _SheetListNon[k])
                {
                    string[] key = cellNon.Key.Split('-');
                    int x = int.Parse(key[0]);
                    int y = int.Parse(key[1]);

                    try
                    {
                        //判断能否找到对应的数据
                        //就是这个地方找不到对应的源-错误消息:无效的源名称 Error offset: 0
                        test.Sheets[k].Cells[x, y].Formula = cellNon.Value.Substring(1);

                    }
                    catch
                    {
                        //找不到直接将公式赋值给单元格
                        test.Sheets[k].Cells[x, y].Text = cellNon.Value.Substring(1);
                    }

                }
            }
红色部分出错了,你可以看一下
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-3-31 10:48:00
16#
回复 15楼seasky083的帖子

问题已经清楚了,感谢详细讲解。已经提高优先级,并且发送给产品组。

由于产品使用问题给您带来不便,抱歉。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-3-31 13:56:00
17#
回复 15楼seasky083的帖子

请使用以下代码测试,在设置公式之前把 EnableCrossSheetReference设置为 true:

  1. public ActionResult Index([FarPoint.Mvc.Spread.MvcSpread(true)]FarPoint.Mvc.Spread.FpSpread test)
  2.         {
  3.             //string str = "'需关闭''帖子'!A19+需解决帖子!A19";
  4.             //Regex r = new Regex(@"('([^']|'')+'|(?<=^|[+\-*\/^&amp;%]).+(?=\!\w+(?:$|[+\-*\/^&amp;%])))");//@"(?<=^|[+\-*\/^&amp;%])('([^']|'')+'|.+?(?=\!\w+(?:$|[+\-*\/^&amp;%])))"
  5.             //MatchCollection ma = r.Matches(str);

  6.             test.Sheets.Clear();

  7.             FpSpread book = new FpSpread();

  8.             book.OpenExcel(this.Server.MapPath("aa.xlsx"));
  9.             int i = 0;
  10.             test.EnableCrossSheetReference = false;//turn off this flag before open excel

  11.             List<Dictionary<string, string>> _SheetListNon = new List<Dictionary<string, string>>();

  12.             foreach (FarPoint.Web.Spread.SheetView sheet in book.Sheets)
  13.             {
  14.                 Dictionary<string, string> dicSheetNon = new Dictionary<string, string>();

  15.                 FpSpread bookIn = new FpSpread();
  16.                 bookIn.Sheets.Add(sheet);
  17.                 MemoryStream ms = new MemoryStream();
  18.                 bookIn.SaveExcel(ms);

  19.                 byte[] b = ms.ToArray();

  20.                 FarPoint.Web.Spread.SheetView sv = new FarPoint.Web.Spread.SheetView();
  21.                 sv.SheetName = sheet.SheetName;
  22.                 test.Sheets.Add(sv);

  23.                 sv.OpenExcel(new MemoryStream(b), 0);

  24.                 int maxrow = sv.RowCount;
  25.                 int maxcol = sv.ColumnCount;
  26.                 //这里将对应的excel单元格内容提取出来(以!号开头的)

  27.                 for (int k = 0; i < maxrow; i++)
  28.                 {
  29.                     for (int j = 0; j < maxcol; j++)
  30.                     {
  31.                         string s = sv.Cells[k, j].Text;
  32.                         string formula = sv.Cells[k, j].Formula;
  33.                         if (!string.IsNullOrEmpty(s) &amp;&amp; string.IsNullOrEmpty(formula))
  34.                         {
  35.                             if (s[0] == '!')
  36.                             {
  37.                                 dicSheetNon.Add(k + "-" + j, s);
  38.                             }
  39.                         }
  40.                     }
  41.                 }
  42.                 _SheetListNon.Add(dicSheetNon);
  43.                 i++;
  44.             }

  45.             //将对应!公式替换掉
  46.             test.EnableCrossSheetReference = true;//turn off this flag before open excel
  47.             for (int k = 0; k < _SheetListNon.Count; k++)
  48.             {
  49.                
  50.                 foreach (KeyValuePair<string, string> cellNon in _SheetListNon[k])
  51.                 {
  52.                     string[] key = cellNon.Key.Split('-');
  53.                     int x = int.Parse(key[0]);
  54.                     int y = int.Parse(key[1]);

  55.                     try
  56.                     {
  57.                         //判断能否找到对应的数据
  58.                         //就是这个地方找不到对应的源-错误消息:无效的源名称 Error offset: 0

  59.                         //test.Sheets[k].Cells[x, y].Formula = cellNon.Value.Substring(1);
  60.                         test.Sheets[k].SetFormula(x, y,cellNon.Value.Substring(1));
  61.                     }
  62.                     catch
  63.                     {
  64.                         //找不到直接将公式赋值给单元格
  65.                         test.Sheets[k].Cells[x, y].Text = cellNon.Value.Substring(1);
  66.                     }

  67.                 }
  68.             }

  69.             test.Sheets[0].PageSize = 30;
  70.             test.Width = 1200;
  71.             test.Height = 500;
  72.             //test.Sheets[0].Cells[0, 0].Formula = "!'Sheet2'!A1".Substring(1);
  73.             return View();
  74.         }
复制代码
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-4-1 09:55:00
18#
回复 15楼seasky083的帖子

很高兴能够协助您解决问题。有后续问题请开新帖沟通。

为了给你提供更优质的服务,请对本次服务进行评分。我们会认真对待你提出的宝贵意见,谢谢   
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部