找回密码
 立即注册

QQ登录

只需一步,快速开始

Alice
社区贡献组   /  发表于:2015-5-15 17:21:00
21#
回复 20楼q406157290的帖子

你说的是WPF的Clipboard方法么?
GetText/SetText是针对string类型的。
GetData/SetData是针对fomat的。
msdn有详细说明:
https://msdn.microsoft.com/zh-cn/library/system.windows.clipboard
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-5-18 08:44:00
22#
回复 21楼Alice的帖子

那您告诉我模板的复制用这种方法 您觉得可行吗
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-5-18 13:55:00
23#
跟你提供一个解决方案吧,用法就参照btnTemplate_Click事件中的说明即可;
  1. private void btnTemplate_Click(object sender, RoutedEventArgs e)
  2. {
  3.         OpenFileDialog ofd = new OpenFileDialog();
  4.         if (ofd.ShowDialog().Value)
  5.         {
  6.                 C1XLBook book = new C1XLBook();
  7.                 book.Load(ofd.FileName, FileFormat.OpenXml, true);
  8.                 XLSheet sheet = book.Sheets[0];
  9.                 // 取template范围作为模版
  10.                 XLCellRange template = new XLCellRange(0, 3, 0, 6);
  11.                 // 应用到(5,0)起始位置
  12.                 ApplyTemplate(sheet, template, 5, 0);
  13.                 book.Save(ofd.FileName, FileFormat.OpenXml);
  14.         }
  15. }
复制代码
  1. /// <summary>
  2. /// 获取工作簿中某块儿区域内的所有合并单元格
  3. /// </summary>
  4. /// <param name="sheet">当前工作簿</param>
  5. /// <param name="rng">指定区域</param>
  6. private List<XLCellRange> GetMergedCellRanges(XLSheet sheet, XLCellRange rng)
  7. {
  8.         List<XLCellRange> mergedCellRanges = new List<XLCellRange>();
  9.         foreach (XLCellRange cellRange in sheet.MergedCells)
  10.         {
  11.                 if (rng.Contains(cellRange))// 包含
  12.                 {
  13.                         mergedCellRanges.Add(cellRange);
  14.                 }
  15.                 else if (rng.Intersects(rng))// 相交,取交集部分作为合并区域
  16.                 {
  17.                         int colFrom = rng.ColumnFrom <= cellRange.ColumnFrom ? cellRange.ColumnFrom : rng.ColumnFrom;
  18.                         int colTo = rng.ColumnTo <= cellRange.ColumnTo ? rng.ColumnTo : cellRange.ColumnTo;
  19.                         int rowFrom = rng.RowFrom <= cellRange.RowFrom ? cellRange.RowFrom : rng.RowFrom;
  20.                         int rowTo = rng.RowTo <= cellRange.RowTo ? rng.RowTo : cellRange.RowTo;
  21.                         mergedCellRanges.Add(new XLCellRange(rowFrom, rowTo, colFrom, colTo));
  22.                 }
  23.         }

  24.         return mergedCellRanges;
  25. }
复制代码
  1. /// <summary>
  2. /// 根据模版templateRng,应用到指定位置(targetRow, targetCol)
  3. /// </summary>
  4. private void ApplyTemplate(XLSheet sheet, XLCellRange templateRng, int targetRow, int targetCol)
  5. {
  6.         // 获取模版区域的合并单元格
  7.         List<XLCellRange> cellRngs = GetMergedCellRanges(sheet, templateRng);
  8.         List<XLCellRange> newMergedRngs = new List<XLCellRange>();
  9.         foreach (XLCellRange mergedRng in cellRngs)
  10.         {
  11.                 int rowFrom = (mergedRng.RowFrom - templateRng.RowFrom) + targetRow;
  12.                 int rowTo = rowFrom + mergedRng.RowCount - 1;
  13.                 int colFrom = (mergedRng.ColumnFrom - templateRng.ColumnFrom) + targetCol;
  14.                 int colTo = colFrom + mergedRng.ColumnCount - 1;
  15.                 newMergedRngs.Add(new XLCellRange(rowFrom, rowTo, colFrom, colTo));
  16.         }
  17.         foreach (XLCellRange rng in newMergedRngs)
  18.         {
  19.                 sheet.MergedCells.Add(rng);
  20.         }

  21.         // 应用样式和内容
  22.         for (int i = templateRng.ColumnFrom; i <= templateRng.ColumnTo; i++)
  23.         {
  24.                 for (int j = templateRng.RowFrom; j <= templateRng.RowTo; j++)
  25.                 {
  26.                         int rowIndex = j - templateRng.RowFrom + targetRow;
  27.                         int colIndex = i - templateRng.ColumnFrom + targetCol;
  28.                         sheet[rowIndex, colIndex].Style = sheet[j, i].Style.Clone();
  29.                         sheet[rowIndex, colIndex].Value = sheet[j, i].Value;
  30.                 }
  31.         }
  32. }
复制代码

评分

参与人数 1金币 +500 收起 理由
Alice + 500 提供方案,奖励500金币。

查看全部评分

回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-5-18 18:44:00
24#
跟你提供一个解决方案吧,用法就参照btnTemplate_Click事件中的说明即可;
[code]private void btnTemplate_Click(object sender, RoutedEventArgs e)
{
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.......
KNight 发表于 2015-5-18 13:55:00


感谢提供的方案。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-5-21 09:29:00
25#
回复 23楼KNight的帖子

谢谢 已经用别的做了 不用C1Excel了  有时候感觉出c1的也太弱了
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-5-21 16:52:00
26#
回复 25楼q406157290的帖子

谢谢你的反馈。
很抱歉给你带来的不便。
如果你对C1控件有任何的建议和意见,欢迎提出。
我们会认真对待来自客户的声音。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-5-22 08:53:00
27#
回复 26楼Alice的帖子

恩啊 是的
使用普通的导出Excel的都有Copy 和paste 的方法
作为第三方控件我自己感觉应该是在原有的基础上有更大的提高,可是为什么会没有最普通的copy和paste的方法呢
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-5-22 12:00:00
28#
回复 27楼q406157290的帖子

你好。
Clipboard有提供SetText和GetText方法进行copy和paste。
但是你的需求恐怕不是这个方法就能够实现的。
根据你对excel的需求,更适合Spread for WPF产品,这个控件有提供Format和Formula的Copy/Paste,和Office Excel类似。
该控件请参考:
http://www.gcpowertools.com.cn/products/spread_wpf.htm
Spread WPF-Silverlight下载:http://www.gcpowertools.com.cn/products/download.aspx?pid=27
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
123
您需要登录后才可以回帖 登录 | 立即注册
返回顶部