首页 > 其他分享 >【原创】将fpspreadsheet的TsWorksheetGrid选择的Cell拷贝为图片

【原创】将fpspreadsheet的TsWorksheetGrid选择的Cell拷贝为图片

时间:2024-12-12 11:45:17浏览次数:9  
标签:begin ActiveWorksheet TsWorksheetGrid srccell Cell range ws Workbook fpspreadshe

网友有个很特别的需求:将xlsx文件选定的单元格复制为图形,然后粘贴到其他单元格以保持复制的单元格不变形,需要用execl可以完成这个任务,我选择fpspreadsheet来解决这个问题。TsWorksheetGrid选择的Cell拷贝为图片。
已知问题:
超出可视范围复制会存在错位的问题。

 复制粘贴后:

 


直接给出代码:
procedure TForm1.CopyCellToPic(ws:TsWorksheetGrid;bgColor:Boolean=true);
var
  Image:TImage;
  RC1, RC2: TRect;
  range: TsCellRangeArray;
  w,h,y1,x1:integer;
  sel: TsCellRange;
  r, c: Cardinal;
  srccell: PCell;
  ACellFormat2:TsCellFormat;
begin
  setlength(range,1);
  range:=ws.Workbook.ActiveWorksheet.GetSelection;

  if not bgcolor then  //不保留背景颜色
  begin
    for sel in ws.Workbook.ActiveWorksheet.GetSelection do
    begin
      for r := sel.Row1 to sel.Row2 do
      begin
        for c := sel.Col1 to sel.Col2 do
        begin
          srccell :=ws.Workbook.ActiveWorksheet.FindCell(r, c);
          if ws.Workbook.ActiveWorksheet.IsMerged(srccell) then
            srccell := ws.Workbook.ActiveWorksheet.FindMergeBase(srccell);
          if srccell <> nil then
          begin
            ACellFormat2:=ws.Workbook.ActiveWorksheet.ReadCellFormat(srccell);
            ACellFormat2.UsedFormattingFields:=[uffTextRotation, uffFont, uffBorder,
            uffNumberFormat, uffWordWrap, uffHorAlign, uffVertAlign, uffBiDi,
            uffProtection, uffDoNotPrint];
            ws.Workbook.ActiveWorksheet.WriteCellFormat(srccell,ACellFormat2);
          end;
        end;
      end;
    end;
  end;
  ws.ClearSelections;
  ws.Refresh;
  range[0].Col1:=range[0].Col1+1;
  range[0].Col2:=range[0].Col2+1;
  range[0].Row1:=range[0].Row1+1;
  range[0].Row2:=range[0].Row2+1;

  Image:=TImage.Create(ws);
  w:=ws.CellRect(range[0].Col1,range[0].Row1,range[0].Col2,range[0].Row2).Width;
  h:=ws.CellRect(range[0].Col1,range[0].Row1,range[0].Col2,range[0].Row2).Height;

  x1:=ws.CellRect(0,0,range[0].Col1-1,range[0].Row1).Width;
  y1:=ws.CellRect(0,0,0,range[0].Row1-1).Height;
  Image.Width:=w;
  Image.Height:=h;

  RC1 := Rect(0, 0, w, h);
  RC2 := Rect(x1, y1, w+x1, h+y1);

  r:=ws.Workbook.ActiveWorksheet.ActiveCellRow;
  c:=ws.Workbook.ActiveWorksheet.ActiveCellCol;

  ws.ClearSelections;
  ws.Refresh;
  ws.Workbook.ActiveWorksheet.SelectCell(r+1,c+1);
  ws.ClearSelections;
  ws.Refresh;

  Image.Canvas.CopyRect(rc1,ws.Canvas,rc2);
  Stream:=TMemoryStream.Create;
  Image.Picture.SaveToStream(Stream);

  ws.Workbook.ActiveWorksheet.SelectCell(r,c);
  ws.ClearSelections;
  ws.Refresh;

  Image.Free;
end;

procedure TForm1.PasteCellToPic(ws:TsWorksheetGrid);
var
  r,c:integer;
begin
  if Stream<>nil then
  begin
    r:=ws.Workbook.ActiveWorksheet.ActiveCellRow;
    c:=ws.Workbook.ActiveWorksheet.ActiveCellCol;
    ws.Workbook.ActiveWorksheet.
    WriteImage(r, c, Stream);
    ws.Refresh;
  end;
end;

 

标签:begin,ActiveWorksheet,TsWorksheetGrid,srccell,Cell,range,ws,Workbook,fpspreadshe
From: https://www.cnblogs.com/qiufeng2014/p/18602106

相关文章

  • 表格bodyCell响应式处理,划入列展示tooltip文字
    //表格优化 bodyCell(column){  if(column.column?.key!=='operation'){   column.column.width='auto';  }  if(column.column.render){   constcellRender=column.column.render.bind(this)   return(   <antTooltip......
  • 论文阅读——Probabilistic error cancellation with sparse Pauli-Lindblad models o
    创新点稀疏Pauli-Lindblad噪声模型:提出了一种新的稀疏Pauli-Lindblad噪声模型,用于捕获量子处理器上的相关噪声。该模型仅包含与量子处理器拓扑相关的低权重Pauli项(weight-one和weight-twoPauli项),从而减少了模型复杂度并提升了学习效率。可扩展的误差学习和消除协......
  • Rust包之once_cell
    在Rust中,once_cell是一个非常有用的crate,用于实现惰性初始化(lazyinitialization)的单例模式。它允许某些值只被初始化一次,并且之后始终保持不变。该功能在需要全局变量或延迟计算的情况下非常实用。关键概念线程安全(sync)与非线程安全(unsync)•OnceCell:适用于单线程......
  • AEC论文解读 -- ACOUSTIC ECHO CANCELLATION WITH THE DUAL-SIGNAL TRANSFORMATION LS
    程序地址预训练模型一、技术解读1.1信号处理1.1.1数据集来源合成数据集:包含10,000个示例,涵盖单工、双工、近端噪声、远端噪声和非线性失真情况。真实录音数据集:包含不同环境中的录音,确保多样性。前500个示例用于工具评估,称为“双工测试集”。训练时仅使用远端信......
  • AT_jsc2019_qual_c Cell Inversion
    算法场上也是把所有需要的性质全部都推出来了,但是计数类型的底子太差,直接也是没把答案式子表示出来啊容易的,我们可以知道,对于一个长度为\(n\)的序列,其中每一个\([l_i,r_i]\)确定,那么不管怎样排列,最终都是合法的我们还可以知道,如果每一个点,作为左端点还......
  • aspose.cells java导出pdf 所有列打印在一页上
    importcom.aspose.cells.PdfSaveOptions;//importcom.aspose.pdf.PdfSaveOptions;importlombok.val;importjava.io.InputStream;publicclassPdfHelper{publicstaticvoidConvertXlsxToPdf(StringsourceFileName,StringtargetFileName,StringtargetFil......
  • 用什么代替html5中不再支持table的cellspacing和cellpadding属性?
    在HTML5中,cellspacing和cellpadding属性确实不再被支持。要用CSS来实现相同的效果,主要依靠border-spacing和padding属性。1.cellspacing的替代方案:border-spacingcellspacing控制表格单元格之间的间距。在CSS中,可以使用border-spacing属性应用于<table>元素......
  • Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    CellebriteUFED4PC7.71(Windows)-Android和iOS移动设备取证软件TheIndustryStandardforLawfullyAccessingandCollectingDigitalData请访问原文链接:https://sysin.org/blog/cellebrite-ufed/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgC......
  • Cellebrite UFED 4PC 7.70 (Windows) - Android 和 iOS 移动设备取证软件
    CellebriteUFED4PC7.70(Windows)-Android和iOS移动设备取证软件TheIndustryStandardforLawfullyAccessingandCollectingDigitalData请访问原文链接:https://sysin.org/blog/cellebrite-ufed/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgC......
  • C# ClosedXML 导出 Excel 添加下拉选项 CellDropdown
    注意string左右两边引号不能省略privatevoidAddCellDropdown(stringpath){//使用ClosedXML打开Excel文件using(varworkbook=newXLWorkbook(path)){//Shee1页面varworksheet1=workbook.Worksh......