找回密码
 立即注册

QQ登录

只需一步,快速开始

bingdaoice

中级会员

44

主题

208

帖子

608

积分

中级会员

积分
608
bingdaoice
中级会员   /  发表于:2019-4-13 15:57  /   查看:5654  /  回复:11
本帖最后由 bingdaoice 于 2019-4-13 16:14 编辑

1、如何获取公式自动改变前的值(我通过EditChange只能获取到用户编辑前的值,但是获取不到公式自动计算改变前的值,公式自动计算时没有触发EditChange这个方法)?
2、如何禁止调整列宽和行高(目前只知道在不显示行头和列头情况下不能调整列宽和行高,但如何在保留显示行头和列头的情况下禁止调整列宽和行高)?
3、如何插入与某行格式、行高、相同合并单元格的行(或插入复制的某行)(试过AddRows方法,此法只能插入一个新行,格式和行高及合并的单元格都没有得到)?
4、获取报表第几页和共多少页的函数(查了所有函数没有发现获取报表第几页和共多少页的函数,需要在表格上显示第几页和共多少页,看到页脚中有第几页共几页,但是我不是在页脚的地方显示的)?

11 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-4-15 17:55:10
沙发
1. 公式变化不会触发控件事件,需要给数据模型绑定事件
            fpSpread1.ActiveSheet.Cells[0, 0].Formula = "A2";
            fpSpread1.ActiveSheet.Models.Data.Changed += Data_Changed;
2. 设置行列Resizable
            fpSpread1.ActiveSheet.Columns[0, 5].Resizable = false;
3. 插入后设置下新行行高和上一行一样,并复制上一行样式
            fpSpread1.ActiveSheet.Rows[5].Height = fpSpread1.ActiveSheet.Rows[4].Height;
            fpSpread1.ActiveSheet.CopyRange(4, 0, 5, 0, 1, 10, false);
4. 暂时没有。
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2019-4-16 14:34:47
板凳
本帖最后由 bingdaoice 于 2019-4-30 21:11 编辑

1、通过  fpSpread1.ActiveSheet.Models.Data.Changed += Data_Changed;
能获取到公式自动计算事件,但是获取到的值是计算后的值,我想获取到改变前的值。
2、通过以下代码添加行,并复制上一行的数据和格式时出错,提示“无法绘制-内存不足”
Spread_Recd.ActiveSheet.Protect = false;
            int Row = Spread_Recd.ActiveSheet.Cells["标准器"].Row.Index;
            int Col = Spread_Recd.ActiveSheet.Cells["标准器"].Column.Index;
            int RowSpan = Spread_Recd.ActiveSheet.Cells["标准器"].RowSpan;
            Spread_Recd.ActiveSheet.AddRows(Row + 1, RowSpan);
            Spread_Recd.ActiveSheet.Rows[Row + 1].Locked = false;
            Spread_Recd.ActiveSheet.CopyRange(Row, 0, Row + 1, 0, RowSpan, Spread_Recd.ActiveSheet.ColumnCount - 1, false);将最后的dataOnly改为true,可以成功的复制数据,但是合并的列和字体样式等格式信息没有复制,改为false又报“无法绘制-内存不足”的错误。


3、建议在新版本中增加以下方法:
1、IsModified 判断FpSpread是否有改动。(如果有改动方便保存最新信息)
2、CombinOtherFile  合并两个报表文件的方法。这对有些统一格式的模板非常有用。(例如两个模板,A为公共模板,B为用户自定模板,A模就可以只做一个,用来和B合并,这样就大大减少了模板制做的数量)
3、BeforeCellContentChanged,在内容改变之前触发事件,可获得单元格改变前的值。
4、在单元格中设置类型为文本,并勾选了“缩小以显示全部内容”和“自动换行”,内容多了以后只会自动换行,并不会自动缩小。建议当换行都不能显示全部内容以后,就缩小字体并换行来显示全部内容。
5、建议增加SetCellCanPrint是否打印属性,此方法设置后,该单元格即便有内容,打印时仍不打印。
6、建议增加一个AddFormatRows方法,直接可以添加行并复制指定行的信息及格式,包括已多行合并的行及合并的列及单元格的类型。
image.png680745544.png
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-4-16 17:07:37
地板
一. 公式的值是计算所得,并不存储,所以没有oldValue,在数据模型中并不储存。如果需要可以再初始是缓存。
二. 这个问题我测试没重现,可否提供个demo或者您测试模板和代码
三. 感谢您的建议

1. 接相关事件就可以知道是否修改了,作为控件会实现更多基本的子操作并是接口尽量少而且简单,无二义性。对于用户的修改,包括了数据修改和样式修改,以及修改后再修改回来,这样的操作通过排列组合会形成太多接口,并不符合控件的设计。
2. 这个功能在我们GCDocument for Excel组件中是有的,Winfroms平台主要是UI呈现暂时还没做,我会反馈您的需求到相关部门
3. 改变之前是进入编辑状态就算,还是开始改内容算,还是推出编辑状态算,我说的三个时机都有事件EditModeOn, EditChange,EditModeOff。看你具体想要什么时机
5. 这个是和Excel保持一致的策略,自动换行优先。
6. 和第一点一致,控件的接口尽量节俭,不做组合接口,你的接口可以通过两步操作完成。
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2019-4-17 10:47:32
5#
感谢dexteryao的解答。
1、建议将公式计算前也增一个触发事件,或者将公式计算时也触发EditChange这个方法。
这样就应该就可以获得计算前的值,这针对记录数据是否修改非常有用。
2、建议增加报表第几页和共多少页的函数。这针对打印方面非常有用,例如:一个表格我也不知道多少页,我想把1,2页发送给A打印机打印,3页、4页发送给B打印机打印,4页以后发送给C打印机打印。
3、CombinOtherFile  合并两个报表文件的方法
请问以上的方法能在新版本的Spread中增加吗?
另外新版本什么时候发布呢?
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2019-4-17 15:38:48
6#
复制上一行的数据和格式时出错,提示“无法绘制-内存不足”
代码如下,DEMO里面,解开这一行就会重现。
image.png745249023.png

WindowsFormsApplication1.rar

14.28 MB, 下载次数: 74

回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-4-17 17:36:09
7#
Demo已收到
1. 暂时不会有,这个之前讨论过。
2. GCDocument for Excel .NET 已经有这两个功能了, Winforms V12的SP版本还没计划,应该近半年还不会有。
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2019-4-19 14:07:02
8#
Demo测试有结果了吗?
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2019-4-23 11:00:35
9#
dexteryao 发表于 2019-4-17 17:36
Demo已收到
1. 暂时不会有,这个之前讨论过。
2. GCDocument for Excel .NET 已经有这两个功能了, Winfo ...

6楼出现的问题,DEMO也发了,你收到了,测试有结果了吗?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-4-23 17:02:53
10#
抱歉没有及时回复,开发那边确认是bug,正在修复。近期会发修复版本。暂时没有临时方案,只能不复制样式,或者重置下样式再复制。
271921
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部