找回密码
 立即注册

QQ登录

只需一步,快速开始

xiwu
中级会员   /  发表于:2010-12-3 11:05:00
11#
  1.         private void buttonItem21_Click(object sender, EventArgs e)
  2.         {
  3.             SheetView sv_洞身衬砌表 = fpSpread1.Sheets["洞身衬砌表"];
  4.             if (sv_洞身衬砌表 == null)
  5.                 return;
  6.             SheetView sv_洞室表 = this.fpSpread1.Sheets["洞室表"];
  7.             if (sv_洞室表 == null)
  8.                 return;
  9.             sv_洞室表.ReferenceStyle = FarPoint.Win.Spread.Model.ReferenceStyle.R1C1;
  10.             //第一步:导入衬砌分段表的里程
  11.             int LinRow = sv_洞身衬砌表.NonEmptyRowCount;//使用的行数(包括表头2行)
  12.             for (int i = 0; i < LinRow - 2; i++)
  13.             {
  14.                 for (int j = 0; j < 4; j++)
  15.                 {
  16.                     sv_洞室表.Cells[i + 3, 14 + j].Value = sv_洞身衬砌表.Cells[i + 2, 1 + j].Value;//
  17.                 }
  18.                 for (int k = 0; k < 6; k++)
  19.                 {
  20.                     string FormlaString = "INDEX(FREQUENCY(R4C" + (k * 2 + 2).ToString() + ":R1000C" + (k * 2 + 2).ToString() + ",R4C15" + ":R" + (LinRow + 2).ToString() + "C15" + ")," + (i + 2).ToString() + ")"; //"IF(ISERROR(VLOOKUP(RC38,词典!R3C1:R300C16," + n.ToString() + ",0)),\"\",VLOOKUP(RC38,词典!R3C1:R300C16," + n.ToString() + ",0))";
  21.                     sv_洞室表.Cells[i + 3, k + 18].Formula = FormlaString;

  22.                 }
  23.             }
  24.             //注意:里程列需要终点里程,这样才能统计最后一段的洞室
  25.             sv_洞室表.Cells[LinRow + 1, 14].Formula = "R[-1]C[1]";
  26.             sv_洞室表.Cells[LinRow + 1, 14].BackColor = Color.DarkOliveGreen;
  27.          

  28.         }
复制代码
回复 使用道具 举报
xiwu
中级会员   /  发表于:2010-12-3 11:08:00
12#
文件内容比较多,我不会拆分,把这段代码发给你看看,
回复 使用道具 举报
gw0506
超级版主   /  发表于:2010-12-3 11:42:00
13#
这些代码肯定没有问题,否则导出Office2007也会重现同样的问题。
导出到Office03格式,显示正确或者错误,Formula信息没有变化,所以说明这里对Spread的数据设置肯定没有问题。

你把导出到Excel相关的代码发给我看看。
回复 使用道具 举报
xiwu
中级会员   /  发表于:2010-12-3 13:53:00
14#
//8、保存函数
        public void SaveSpread()
        {
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.Filter = "*.xls|*.xls|*.xml|*.xml|*.xlsx|*.xlsx";
            dlg.FileName = "book1";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string extension = Path.GetExtension(dlg.FileName);
                extension = extension.ToLower();
                switch (extension)
                {
                    case ".xls":
                        fpSpread1.SaveExcel(dlg.FileName);
                        break;
                    case ".xml":
                        fpSpread1.Save(dlg.FileName, false);
                        break;
                    case ".xlsx":
                        fpSpread1.SaveExcel(dlg.FileName, FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat);
                        break;

                }
            }
        }
回复 使用道具 举报
gw0506
超级版主   /  发表于:2010-12-3 14:43:00
15#
好像是Excel 03对公式的解析有问题。
比如:

公式1=INDEX(FREQUENCY(A1:A5,B2:B3),1)
公式2=FREQUENCY(A1:A5,B2:B3)

在Spread中:   公式1 正确, 公式2  非法
Excel 03中:    公式1 非法, 公式2  正确
Excel 07中:    公式1正确,  公式2  正确

所以你可能需要在写点代码,在导出到Excel 03之前,将公式统统换掉,去掉INDEX()。
回复 使用道具 举报
xiwu
中级会员   /  发表于:2010-12-3 16:25:00
16#
不对啊excel03 也是支持这样写的 INDEX(FREQUENCY($B$4B$1000,$O$4O$87),13)
回复 使用道具 举报
gw0506
超级版主   /  发表于:2010-12-3 16:28:00
17#
你在Excel 03里面,直接写完了再回车,跟导入到excel里,双击进入编辑模式在切换出来一样的。所以直接编辑Excel里的公式,没法重现这个问题。

而且,即便你直接写成这样,显示正常了,它也有个Warning 提示。

去掉INDEX,导出到Excel 03里,是正常的。这是Excel 03解析公式的问题。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部