控制excel使用自定义纸张的问题,为什么不行(100分)

  • 主题发起人 主题发起人 xiongw
  • 开始时间 开始时间
X

xiongw

Unregistered / Unconfirmed
GUEST, unregistred user!
这是引用的做法:
wiwei (2004-05-13 16:41:51)
先定義好my 的長和寬:2150和1400然後調用以
sh1.pagesetup.papersize:=GetPaperno;
function GetPaperno:integer;
var
printername:string;
dwPapers: DWord;
lpwPapers: array[0..255] of Word;
papersize:array[0..63,0..1] of integer;
begin
result:=0;
printername:=printer.Printers[printer.PrinterIndex];
dwPapers:=DeviceCapabilities(PChar(PrinterName),'LPT1',DC_PAPERS,@lpwPapers,nil);
DeviceCapabilities(PChar(PrinterName),'LPT1',DC_PAPERsize,@Papersize,nil);
while (dwPapers > 0) do
begin
// showmessage('u:'+inttostr(Papersize[dwpapers,0]));
// showmessage('u:'+inttostr(Papersize[dwpapers,1]));
if (Papersize[dwpapers,0]=2150) and (Papersize[dwpapers,1]=1400) then
begin
result:=lpwPapers[dwPapers];
// showmessage(inttostr(lpwPapers[dwPapers]));
end;
{
case DWORD(lpwPapers[dwPapers]) of
DMPAPER_USER: showmessage(inttostr(lpwPapers[dwPapers]));
DMPAPER_A3: showmessage(inttostr(lpwPapers[dwPapers]));
DMPAPER_A4: showmessage(inttostr(DWORD(lpwPapers[dwPapers])));
DMPAPER_B5: showmessage(inttostr(lpwPapers[dwPapers]));
end; }
dwPapers:=dwPapers-1;
end;
end;
下面是我的写法:
procedure TMainForm.Button4Click(Sender: TObject);
Var FExcel :OleVariant; //excel应用程序
FWorkBook :OleVariant; //工作表
FWorksheet:OleVariant; //工作薄
FPicture:OleVariant;
TmpStr:String;
begin
FExcel:= CreateoleObject('excel.Application');
FWorkBook:=FExcel.WorkBooks.Add; //新的工作表
FWorksheet:=FWorkBook.Worksheets[1];
FWorksheet.Select;

//插入图象并设置位置与大小
tmpstr:='c:/aa.bmp';
FPicture:=FWorksheet.Pictures.Insert(tmpstr);
FPicture.Left:=0; //左上角位置
FPicture.Top:=0; //
FPicture.width:=220; //设定图片覆盖的面积
FPicture.height:=90;
FPicture:='null';
FWorksheet.PageSetup.PaperSize := GetPaperno;

FExcel.visible:=true;

end;
可是为什么执行到 FWorksheet.PageSetup.PaperSize := GetPaperno时会出错,提示‘不能设置pagesetup类的papersize属性‘
这到底怎么搞,
我已经设定了21。50cm和14.00cm的纸
(或者大家有没有办法帮我实现这样的功能,我有一张图片,要打到条码上,要编程实现,要求可以动态调整图片打印在条码上的位置,我以上程式是想通过控制excel来实现)
 
大俠請幫忙,近一個月,我空送了500分出去,都沒有好的解答;我要實現的功能很簡單
:就是在編輯好一個圖片後,我要發送到條碼打印機打印,要求能夠方便地控制圖片在條碼上的打印位置,即圖片長寬可調,打印位置可調,(我產生的圖片長寬固定)
比如說:我要一行打三個label,行與列間隙為2mm,label長38mm高15mm,程式只要能以一行為打印單位就好了,不用細化到每一個label,各位有在excel模板控制,word模板控制或是其它報表控件如fastreport控制經驗的,請提供這方面的代碼,可以的話,我再開貼送200分
 
理解搂住迫切的心情,祝你早点找到解决办法
 
俺记得quickreport有打印标签的例子,你参考一下
 
我的需求不是印標簽,我需要動態改變標簽上圖片的位置
 
"可是为什么执行到 FWorksheet.PageSetup.PaperSize := GetPaperno时会出错,提示‘不能设置pagesetup类的papersize属性‘"
对与这个是不是不能用整形值啊。我查到的资料如下:
pagerSize 必须是一个 XlPaperSize 类型

XlPaperSize 可为以下 XlPaperSize 常量之一。
xlPaper11x17. 11 in. x 17 in.
xlPaperA4. A4 (210 mm x 297 mm)
xlPaperA5. A5 (148 mm x 210 mm)
xlPaperB5. A5 (148 mm x 210 mm)
xlPaperDsheet. D size sheet
xlPaperEnvelope11. Envelope #11 (4-1/2 in. x 10-3/8 in.)
xlPaperEnvelope14. Envelope #14 (5 in. x 11-1/2 in.)
xlPaperEnvelopeB4. Envelope B4 (250 mm x 353 mm)
xlPaperEnvelopeB6. Envelope B6 (176 mm x 125 mm)
xlPaperEnvelopeC4. Envelope C4 (229 mm x 324 mm)
xlPaperEnvelopeC6. Envelope C6 (114 mm x 162 mm)
xlPaperEnvelopeDL. Envelope DL (110 mm x 220 mm)
xlPaperEnvelopeMonarch. Envelope Monarch (3-7/8 in. x 7-1/2 in.)
xlPaperEsheet. E size sheet
xlPaperFanfoldLegalGerman. German Legal Fanfold (8-1/2 in. x 13 in.)
xlPaperFanfoldUS. U.S. Standard Fanfold (14-7/8 in. x 11 in.)
xlPaperLedger. Ledger (17 in. x 11 in.)
xlPaperLetter. Letter (8-1/2 in. x 11 in.)
xlPaperNote. Note (8-1/2 in. x 11 in.)
xlPaperStatement. Statement (5-1/2 in. x 8-1/2 in.)
xlPaperUser. 用户自定义
xlPaper10x14. 25.40 cm. x 35.56 cm.
xlPaperA3. A3 (297 mm x 420 mm)
xlPaperA4Small. A4 Small (210 mm x 297 mm)
xlPaperB4. B4 (250 mm x 354 mm)
xlPaperCsheet. C size sheet
xlPaperEnvelope10. Envelope #10 (4-1/8 in. x 9-1/2 in.)
xlPaperEnvelope12. Envelope #12 (4-1/2 in. x 11 in.)
xlPaperEnvelope9. Envelope #9 (3-7/8 in. x 8-7/8 in.)
xlPaperEnvelopeB5. Envelope B5 (176 mm x 250 mm)
xlPaperEnvelopeC3. Envelope C3 (324 mm x 458 mm)
xlPaperEnvelopeC5. Envelope C5 (162 mm x 229 mm)
xlPaperEnvelopeC65. Envelope C65 (114 mm x 229 mm)
xlPaperEnvelopeItaly. Envelope (110 mm x 230 mm)
xlPaperEnvelopePersonal. Envelope (3-5/8 in. x 6-1/2 in.)
xlPaperExecutive. Executive (7-1/2 in. x 10-1/2 in.)
xlPaperFanfoldStdGerman. German Legal Fanfold (8-1/2 in. x 13 in.)
xlPaperFolio. Folio (8-1/2 in. x 13 in.)
xlPaperLegal. Legal (8-1/2 in. x 14 in.)
xlPaperLetterSmall. Letter Small (8-1/2 in. x 11 in.)
xlPaperQuarto. Quarto (215 mm x 275 mm)
xlPaperTabloid. Tabloid (11 in. x 17 in.)
注意 上面这些纸张大小可能不为所有打印机支持。
 
打印图片完全可以直接操作打印机的Canvas属性实现就可以了。
下边是我写的两个画图的函数,见效了。
{ 这个函数的作用是在指定的Bitmap的指定区域内画另外一个Bitmap的指定区域,并将指定颜色透明处理。我用来在图片上盖章。
}
procedure DrawTrans(var dest:TBitmap;destRect :TRECT;source:TBitmap;srcRECT :TRECT;tCl:TColor);
var
tb1,tb2:TBitmap;
R,G,B:Byte;
i,x,y :Integer;
cs,cd:PByteArray;
begin
{初始化}
R:=GetRValue(tcl);
G:=GetGValue(tcl);
B:=getBvalue(tcl);
tb1:=Tbitmap.Create ;
tb2:=Tbitmap.Create ;
tb1.HandleType :=bmDIB;
tb2.HandleType :=bmDIB;
tb1.PixelFormat :=pf24bit;
tb2.PixelFormat :=pf24bit;
{第一步: 变大小,将source中srcRect部分拷贝出来并缩放为 destREct大小
这里为了减小失真采取两步,后截取,后变大小,);
这里有个坐标转换的问题 }
tb1.Width :=srcrect.Right -srcrect.Left;
tb1.Height :=srcrect.Bottom -srcrect.Top;
tb1.canvas.CopyRect(rect(0,0,srcrect.Right -srcrect.Left ,srcrect.Bottom -srcrect.Top),source.Canvas ,srcRect);
tb2.Height :=dest.Height ;
tb2.Width :=dest.Width ;
tb2.Canvas.StretchDraw(destrect,tb1);
tb1.FreeImage ;
tb1.Assign(dest);
{第二步: 复制非透明部分}
tb2.Width :=tb1.Width ;
tb2.Height :=tb1.Height ;
for Y:=0 to tb2.height -1 do
begin
cd:=tb1.ScanLine[Y];
cs:=tb2.ScanLine[Y];
for X:=0 to tb2.Width -1 do
if not(( Abs(cs[X*3]-B)<1) and ( Abs(cs[X*3+1]-G)<1)and( Abs(cs[X*3+2] -R)<1)) then
for I:=0 to 2 do cd[x*3+I]:=cs[x*3+I];
end;
dest.Assign(tb1);
tb1.free;
tb2.free;
end;
 
to:abin30
可否留下联系方式,我待会按你说的方法试试,
 
查下ocx目录下面的server目录,里面有XlPaperSize 的声明
 
email:abin30@163.com
qq:379721851
 
我試了一下,也找了些資料,有個問題:
procedure TfrmMain.butPrinterClick(Sender: TObject);
begin
Printer.BeginDoc;
Printer.Canvas.StretchDraw(Rect(20, 20,810,550), Image1.Picture.Graphic);
Printer.Canvas.StretchDraw(Rect(20, 600,810,550), Image1.Picture.Graphic);//这句不知道为什么打印出来是反的?
Printer.EndDoc;
end;
因為我要印label,一行會有多個,這個怎麼解?現在我是在激光打印機上試的,那如果要印多行呢,又是怎麼樣?
 
OK,打印多個的問題已解決,我把它的參數當作相對參數了,接下來是行控制的問題,如何精確控制到一行?
 
沒有朋友做過直接打印條碼的嗎,
 
后退
顶部