Delphi提取xlsx或docx中的图片

本人水平有限,如有错误,欢迎指正!

思路:在工作中经常会在word或Excel文件中插入图片,如果想把里面的文件提取出来,就需要打开文档,然后复制粘贴等一系列操作,为了减少工作步骤,开发了这个提取图片的小程序。

unit GetWordPicu1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, sBitBtn,
  sSkinManager, sLabel, sEdit, Vcl.Mask, sMaskEdit, sCustomComboEdit, sToolEdit,
  Vcl.ComCtrls, sListView, acShellCtrls, ieview, iemview, iexFolderMView,
  sDialogs,strutils,shellapi, sStatusBar;

type
  TForm1 = class(TForm)
    sSkinManager1: TsSkinManager;
    sLabel1: TsLabel;
    sEdit1: TsEdit;
    sBitBtn2: TsBitBtn;
    sLabel2: TsLabel;
    sDirectoryEdit1: TsDirectoryEdit;
    ImageEnFolderMView1: TImageEnFolderMView;
    sOpenDialog1: TsOpenDialog;
    sBitBtn1: TsBitBtn;
    sStatusBar1: TsStatusBar;
    procedure sBitBtn2Click(Sender: TObject);
    procedure sDirectoryEdit1Change(Sender: TObject);
    procedure sBitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function GetRndString(slen:Integer):string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses SevenZip,IOUtils;

function TForm1.GetRndString(slen:Integer):string;
var
  SourceStr,str:string;
  i:integer;
begin
  SourceStr:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  randomize;
  for i:=1 to slen do
    str:=str+sourcestr[Random(62)+1];
  result:=str;
end;


function DelDirectory(const Source: string): boolean;
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := 0;
wFunc := FO_DELETE;
pFrom := PChar(Source + #0);
pTo := #0#0;
fFlags := FOF_NOCONFIRMATION + FOF_SILENT;
end;
Result := (SHFileOperation(fo) = 0);
end;

function CopyFiles(const Source,Dest: string): boolean;
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := 0;
wFunc := FO_COPY;
pFrom := @source[1];
pTo :=pchar(dest);
fFlags := FOF_NOCONFIRMATION+FOF_NOCONFIRMMKDIR ;
end;
Result := (SHFileOperation(fo) = 0);
end;


procedure TForm1.sBitBtn1Click(Sender: TObject);
var
  pa,wefilename,zipfilename,dirname,imagefilespath,destpath,msg:string;
begin
  if self.sEdit1.Text='' then
  begin
    showmessage('对不起,请先选择要提取图片的文档!');
    exit;
  end;
  if self.sDirectoryEdit1.Text='' then
  begin
    showmessage('对不起,请选择提取后的图片保存文件夹!');
    exit;
  end;
  destpath:=self.sDirectoryEdit1.Text+'\';
  wefilename:=self.sEdit1.Text;
  pa:=extractfilepath(Application.ExeName);
  if rightstr(pa,1)<>'\' then
    pa:=pa+'\';
  zipfilename:=pa+'TempFiles\'+replacestr(extractfilename(self.sEdit1.Text),ExtractFileExt(self.sEdit1.Text),'.zip');
  try
    //CopyFile(PWideChar(wefilename),PWideChar(zipfilename),false);//复制成zip文件
    CopyFiles(wefilename,zipfilename);
  finally
    //解压缩文件
    //在TempFiles下创建一个临时文件夹,用于解压缩
    dirname:=pa+'TempFiles\T_'+self.GetRndString(10)+'\';
    ForceDirectories(dirname);//创建多层文件夹
    with CreateInArchive(CLSID_CFormatZip) do
    begin
      //将1.zip中文件解压到C盘根目录
      OpenFile(zipfilename);
      ExtractTo(dirname);
      Close;
    end;
  end;
  if UpperCase(rightstr(wefilename,5))='.XLSX' then//如果是Excel文件
  begin
    imagefilespath:=dirname+'\xl\media\';
  end
  else
  begin
    imagefilespath:=dirname+'\word\media\';
  end;
  //把imagefilespath中的文件全部复制到
  try
    TDirectory.Copy(imagefilespath,destpath);
  finally
    self.ImageEnFolderMView1.RefreshFileList;
    //删除zip文件和dirname文件夹
    DelDirectory(dirname);
    DeleteFile(zipfilename);
    msg:='图片提取完毕,共提取图片'+inttostr(self.ImageEnFolderMView1.ImageCount)+'个!';
    ShowMessage(msg);
  end;
end;

procedure TForm1.sBitBtn2Click(Sender: TObject);
begin
  //将原文件复制成另一份的ZIP文件,然后对复制后的文件进行解压缩,提取图片文件并复制到目标文件夹中
  if self.sOpenDialog1.Execute then
  begin
    self.sEdit1.Text:=self.sOpenDialog1.FileName;

  end;
end;

procedure TForm1.sDirectoryEdit1Change(Sender: TObject);
begin
  self.ImageEnFolderMView1.Folder:=self.sDirectoryEdit1.Text;
end;

end.

不需Excel也可讀寫xls檔的Delphi控件 用来读取Excel,Access的控件 读写任何单元值 数字型、字符型、布尔型以及错误型。但是你了解日期和时间型单元吗?在Excel中没有这样的单元。Excel是和Delphi一样的方式来存储日期和时间的,即浮点型。那是什么制造了日期时间值啦,是格式化。 完全支持公式。你可以使用和Excel一样的函数,也支持对外部工作簿引用的公式,你甚至可以从外部引用读取结果。 与操作Delphi的TStringGrid一样的方式操作单元格,则通过给单元格命名,比如:”D7” 根据单元格的规则以字符串格式读取单元值 根据你的需求格式化单元 格式化很简单。通过获取单元格,你就可以操作单元的格式属性。例如:XLSReadWriteII.Sheet[n].Cell[Col,Row].FontSize := 12; 你也可以对域进行格式化,比如设置边框。 支持所有的Excel格式选项 合并单元格 操作所有的打印选项 选择页面大小,设置边距 设置标题和页脚,包括格式码。 定义打印区域 设置分页符 XLSReadWriteII完全支持Unicode 所有的字符型都是宽字符型。你完全不必担心非英语字符。 控件 你可以插入控件以及定义他们的源和目的单元 绘图 插入所有种类的绘图,从简单的线条到AutoShapes 多行文本和文本框 创建和编辑文本框以及多行文本 图表 创建和Excel中一样选项的图表 复制/移动/删除 可以以Excel一样的行为复制、移动和删除单元 行列也可以像单元一样复制和移动 支持工作簿之间的复制和移动 可以复制整个工作簿 使用命名的域/单元 你可以在你想要的任何地方命名 通过命名访问单元格,例如:XLS.NameAsFloat['MyCell'] := 202.5; 支持指定、内置的名称 支持所有超链接类型 网页和E-mail地址 本地文件 服务器文件 工作薄引用 加密文档 你可以读写加密文件。条件是你需要知道文件的密码。 计算 可计算单元以及整个工作薄 计算引擎将依据单元进行计算。 可读取引用的外部工作薄。这通过一个特殊的快速查询程序进行执行 Rich Text单元 为了轻松地创建多字体格式的单元,单元可以以RTF格式读写 VBA宏 可以读写文件中的宏,使用XLSReadWriteII可以为控件比如:按钮、组合框等添加宏 导入及导出 从下列导入数据… Open Office Calc文档 CSV文件以及其他可以自动识别分隔符、小数分隔符和文本引用字符的文本文件 HTML表格(标签) 数据库 导出数据为… CSV文件 HTML文件 其他 自动过滤 单元验证 有条件的格式 合并单元 PaintCell方法:将单元内容渲染到TCanvas对象的 XLSReadWriteII包还包含下列组件: 从任何数据库中导入数据到工作薄 工作薄导出为HTML文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锋回路转2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值