为有中文需求的客户提供多渠道中文技术支持.

Thu Mar 30, 2023 7:05 am

版本:13.3.2最新版 free
系统:win10
开发平台:vs2022

问题描述:

Excel表格,有合并单元格,需要做逐行数据导入,那么要做的事情就是,找到合并的单元格清单,取消合并,然后把第一个单元格的内容,复制到合并趋于的每一个单元格。然后再做导入。

现在发现,用sheet.Copy方法,会失败,只有单元格是常规的,且内容是文本的,才能正常复制,其他日期,数字等,都无法正确复制填充到取消合并的单元格。

附件中有 Excel样表,有运行代码后的截图效果,不知道怎么加载图片到帖子中,请帮忙找解决方案吧,谢谢!


Code: Select all
private void unMergeAndCopy()
{
    string file = @"D:\Excel\test.xlsx";

    Workbook workbook = new Workbook();
    workbook.LoadFromFile(file);

    Worksheet sheet = workbook.Worksheets[0];

    CellRange[] rangeList = sheet.MergedCells;

    foreach (CellRange srcRange in rangeList)
    {
        string fromLocal = srcRange.Cells.First().RangeAddressLocal;

        //string toLocal = srcRange.Cells.Last().RangeAddressLocal;

        srcRange.UnMerge();

        CellRange rangeFirst = srcRange.Cells.First();

        foreach (CellRange rangeItem in srcRange)
        {
            string itemAddress = rangeItem.RangeAddressLocal;

            //无论是用地址变量,还是直接单元格复制,都有问题,保存后的单元格没有值,或者没有显示内容
            //if (fromLocal != itemAddress)
            //    sheet.Copy(sheet.Range[fromLocal], sheet.Range[itemAddress], true);

            if (rangeItem != rangeFirst)
                sheet.Copy(rangeFirst, rangeItem, true);
        }
    }

    //以写死的位置复制到写死的位置,复制就能带过去值和格式,显示也正常
    //sheet.Copy(sheet.Range["A3"], sheet.Range["A4"], true);
    //sheet.Copy(sheet.Range["A3"], sheet.Range["A5"], true);

    //sheet.Copy(sheet.Range["A6"], sheet.Range["A7"], true);
    //sheet.Copy(sheet.Range["A6"], sheet.Range["A8"], true);
    //sheet.Copy(sheet.Range["A6"], sheet.Range["A9"], true);


    //sheet.Copy(sheet.Range["B2"], sheet.Range["B3"], true);
    //sheet.Copy(sheet.Range["B2"], sheet.Range["B4"], true);

    //sheet.Copy(sheet.Range["C5"], sheet.Range["C6"], true);
    //sheet.Copy(sheet.Range["C5"], sheet.Range["C7"], true);

    //sheet.Copy(sheet.Range["C8"], sheet.Range["C9"], true);
    //sheet.Copy(sheet.Range["C8"], sheet.Range["C10"], true);

    //sheet.Copy(sheet.Range["E2"], sheet.Range["E3"], true);
    //sheet.Copy(sheet.Range["E2"], sheet.Range["E4"], true);

    //sheet.Copy(sheet.Range["E5"], sheet.Range["E6"], true);
    //sheet.Copy(sheet.Range["E5"], sheet.Range["E7"], true);

    //sheet.Copy(sheet.Range["E8"], sheet.Range["E9"], true);
    //sheet.Copy(sheet.Range["E8"], sheet.Range["E10"], true);


    workbook.SaveToFile(file, ExcelVersion.Version2010);
    MessageBox.Show("执行完成!");
}

xiaoyaoju
 
Posts: 8
Joined: Sat Jan 23, 2021 7:03 am

Thu Mar 30, 2023 7:06 am

https://www.e-iceblue.com/forum/spire-xls-sheet-copy-does-not-work-correct-t12105.html?sid=18b2be4a3ded417b6c55ded4149c1af6

在英文版论坛也提交了问题,如果有解决方案,方便的话,请发邮件给我吧,谢谢!

我的邮箱:[email protected]

xiaoyaoju
 
Posts: 8
Joined: Sat Jan 23, 2021 7:03 am

Fri Mar 31, 2023 3:16 am

您好,

感谢你的咨询。
请参考以下代码
Code: Select all
            foreach (CellRange srcRange in rangeList)
            {

                srcRange.UnMerge();

                CellRange rangeFirst = srcRange.CellList.First();
                string value = rangeFirst.DisplayedText;

                foreach (CellRange rangeItem in srcRange)
                {
                    if (rangeItem != rangeFirst)                 
                        rangeItem.Text= value;
     
                }
            }

如果我的代码没有满足您的需求或者你有其他的问题,欢迎你随时联系我们。

Best regards,
Triste
E-iceblue support team
User avatar

Triste.Dai
 
Posts: 1000
Joined: Tue Nov 15, 2022 3:59 am

Mon Apr 03, 2023 8:55 am

我试了您提供的代码,这次能正常复制内容,很奇怪,为什么copy就没能实现,另外,为什么获取的value,传给新单元格的value就不能行,需要复制 displayText,然后传给新单元格的text才行呢?

如果可以,建议在下个版本的 sheet.copy中完善这个问题,谢谢您的解答。

xiaoyaoju
 
Posts: 8
Joined: Sat Jan 23, 2021 7:03 am

Tue Apr 04, 2023 6:12 am

您好,

感谢您的反馈。
我们已将该问题记录到我们的问题追踪系统之中,编号:SPIREXLS-4599,我们的开发人员将会调查并解决这个问题,这个问题一旦被修复,我们会第一时间通知您。给您带来不便,我们感到非常抱歉。

Best regards,
Triste
E-iceblue support team
User avatar

Triste.Dai
 
Posts: 1000
Joined: Tue Nov 15, 2022 3:59 am

Fri May 12, 2023 3:29 am

您好,

很高兴通知您我们发布了最新版本的Spire.XLS_13.5.0 hotfix, 包含了您的问题SPIREXLS-4599的修复,请从以下链接下载并进行测试。
网站链接:https://www.e-iceblue.cn/Downloads/Spire-XLS-NET.html
Nuget:https://www.nuget.org/packages/Spire.XLS/13.5.0

Best regards,
Triste
E-iceblue support team
User avatar

Triste.Dai
 
Posts: 1000
Joined: Tue Nov 15, 2022 3:59 am

Return to 中文技术支持

cron