返回公众号历史文章目录

文章 / 公众号历史文章

『代码实现版续篇』彻底攻克Excel打印或转PDF信息丢失问题,附上攻克全过程

上周分享过的文章,提供的是一个全新的思路,实现Excel打印或转PDF信息丢失问题。 当然,如果经常有这种需求,有那么强烈的共性可提炼,最佳的方式,仍然是使用代码的方式将逻辑固化下来,不必每次都手动去操作。 因为原理性的掌握透彻,所以,也不必使用界面性的操作,需要复制打印的区域,再粘贴到链接图片,直

上周分享过的文章,提供的是一个全新的思路,实现Excel打印或转PDF信息丢失问题。

当然,如果经常有这种需求,有那么强烈的共性可提炼,最佳的方式,仍然是使用代码的方式将逻辑固化下来,不必每次都手动去操作。

因为原理性的掌握透彻,所以,也不必使用界面性的操作,需要复制打印的区域,再粘贴到链接图片,直接插入一张图片,将它的

DrawingObject.Formula修改一下,会更稳定可靠(复制操作涉及到系统剪切板操作,容易出现各种异常报错行为,特别是复制的内容过大时,在复制完再进行下一步操作时可能会剪切板内容还没准备好等各种异常)。

当然这里的插入图片可以是任意图片,要想速度性能好,那当然是插入一个像素很小的图片即可。

有共性的需求,就有动力将它做成插件的形式发布出来,这一功能也不例外,已经收录到Excel催化剂的功能里,下一版本发布时即可使用,敬请期待。使用本功能前,需要自行设定好打印区域。

公众号文章插图

转换后会另存为一个新的文件,供下一步打印或转PDF操作,不建议在这个新生成的文件上再作其他处理,若需修改,从源工作薄上修改后再操作一遍此功能更科学。

公众号文章插图

GPT时代代码也是廉价的,思路比代码重要,当然用爱发电,代码也不吝啬给大家借鉴参考下,下面附上源码:

    private void btnConvertLinkPicSht_Click(object sender, RibbonControlEventArgs e)    {        try        {  
            var wkb = Common.ExcelApp.ActiveWorkbook;            if (!File.Exists(wkb.FullName))            {                UIMessageTip.ShowError("请先保存本工作薄后再操作。", delay: 2000);                return;            }  
            var tmpWkbFilePath = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(wkb.FullName)+"_链接图片版"+Path.GetExtension(wkb.FullName));                        wkb.SaveCopyAs(tmpWkbFilePath);            var newWkb = Common.ExcelApp.Workbooks.Open(tmpWkbFilePath, ReadOnly: true);            var tmpFilePath = Path.GetTempFileName();            Properties.Resources.图表.Save(tmpFilePath);            Common.ExcelApp.ScreenUpdating = false;  
            foreach (Excel.Worksheet sht in newWkb.Worksheets)            {                if (sht.Visible == Excel.XlSheetVisibility.xlSheetVisible &&                    sht.Names.OfType<Excel.Name>().Any(t => t.Name.Split('!')[1] == "Print_Area") &&                                        sht.Shapes.OfType<Excel.Shape>().Any(s => s.Type != MsoShapeType.msoPicture && s.TextFrame2.HasText == MsoTriState.msoTrue))                {                    var shtName = sht.Name;                    sht.Name = shtName + "旧";                    var shtIndex = sht.Index;  
                    sht.Copy(Before: sht);  
                    Excel.Worksheet shtNew = newWkb.Worksheets[shtIndex];                    shtNew.Name = shtName;  
                    shtNew.DrawingObjects().ShapeRange.Delete();  
                    shtNew.Cells.Clear();                    Excel.Range dstRange = shtNew.Range["Print_Area"];                    var shp = shtNew.Shapes.AddPicture(                         tmpFilePath,                         MsoTriState.msoTrue,                         MsoTriState.msoTrue,                         dstRange.Left,                         dstRange.Top,                         dstRange.Width,                         dstRange.Height);  
                    shp.DrawingObject.Formula = $"'{sht.Name}'!Print_Area";                    shp.Top = dstRange.Top;                    shp.Left = dstRange.Left;                    shp.Width = dstRange.Width;                    shp.Height = dstRange.Height;                    sht.Visible = Excel.XlSheetVisibility.xlSheetHidden;  
                }  
            }  
        }        catch (Exception ex)        {            Common.OutMsgError(ex);        }        finally        {            Common.ExcelApp.ScreenUpdating = true;        }  
    }}