ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 540|回复: 12

[求助] 如果想用邮件合并完成这样的准考证排版如何完成?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-29 17:58 | 显示全部楼层 |阅读模式
本人想用邮件合并,做大量的准考证,
要求:正确批量导入相片,每页最多两名同学,同一个班的学生准考证在同一页,不同班的学生不能同页,以方便打印分发。
(本人用网上的教程做,经常出现莫名错误,有时候是相片显示不出来,有时候是相片显示有误,特别是处理相片较多的时候)

准考证模板

准考证模板

相片

相片

学生信息

学生信息

练习文件.zip (284.02 KB, 下载次数: 14)
哪个高手能指点迷津。谢谢。

TA的精华主题

TA的得分主题

发表于 2024-7-29 21:18 | 显示全部楼层
三步完成:
1.规范信息


01.jpg

2.邮件合并
带图片邮件合并01.gif
3.统一照片大小
统一照片大小.gif


插件下载: Word小秘书
https://kdocs.cn/l/cpBmS1b0BBqy

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-29 21:36 来自手机 | 显示全部楼层


<?php

//https://club.excelhome.net/forum.php?mod=viewthread&tid=1698331&fromguid=hot&extra=&mobile&_dsign=9e196901
//准考证打印
$file=__DIR__.'/in.txt';
$file_out=__DIR__.'/out.html';
$f=fopen($file,'r');
$f_out=fopen($file_out,'w');
$row=0;
$out="";
while(!feof($f)){

$str=trim(fgets($f),"\n");
if($row==0){
$str="<table class=\"inner\" border=1 cellpadding=''6'' cellspacing=0 style=\"margin:10px;\"><caption><strong>$str<br></strong></caption>\n";
$row++;
}else{
        $arr=explode("\t",$str);
        $arr=array_filter($arr);
        array_walk($arr,function(&$value,$key){
        $class_names="";       
                if(preg_match("~#(\d)$~",$value,$matches)){
                        $row_span_num=$matches[1];
                       
                }
                if(preg_match("~^(\d)x~",$value,$matches)){


                        $span_num=$matches[1];
                }

                if(preg_match("~{(.*)}~",$value,$matches)){


                        $class_names=$matches[1];
                }
        //fields               
                if(preg_match("~@(.+)@~",$value,$matches)){
                        //no rowspan no colspan
                        if(empty($row_span_num)&&empty($span_num)){
                       
                $value="<td  class=\"$class_names\" >'||$matches[1]||'</td>";
                        }

                        // rowspan no colspan
                        if(!empty($row_span_num)&&empty($span_num)){
                       
                $value="<td  rowspan=$row_span_num class=\"$class_names\" >'||$matches[1]||'</td>";
                        }
                        // no rowspan  colspan
                        if(empty($row_span_num)&&!empty($span_num)){
                       
                $value="<td colspan=\"$span_num\"  class=\"$class_names\" >'||$matches[1]||'</td>";
                        }
                        //  rowspan and colspan
                        if(!empty($row_span_num)&&!empty($span_num)){
                       
                $value="<td colspan=\"$span_num\"  rowspan=$row_span_num  class=\"$class_names\" >'||$matches[1]||'</td>";
                        }
       

                }else{//constant
$value=preg_replace('/^\dx|#\d$/','',$value);

                        //no rowspan no colspan
                        if(empty($row_span_num)&&empty($span_num)){
                       
                $value="<td colspan=\"1\"  rowspan=\"1\"  class=\"$class_names\" >$value</td>";
                        }

                        // rowspan no colspan
                        if(!empty($row_span_num)&&empty($span_num)){
                       
                $value="<td  rowspan=$row_span_num  class=\"$class_names\" >$value</td>";
                        }
                        // no rowspan  colspan
                        if(empty($row_span_num)&&!empty($span_num)){
                       
                $value="<td colspan=\"$span_num\"  class=\"$class_names\" >$value</td>";
                        }
                        //  rowspan and colspan
                        if(!empty($row_span_num)&&!empty($span_num)){
                       
                $value="<td colspan=\"$span_num\"  rowspan=$row_span_num  class=\"$class_names\" >$value</td>";
                        }
       




                }
        });
        $str=implode("  ",$arr);



$str="<tr>$str</tr>\n";
}
//echo $str;
$out.=$str;
}
$out.="</table>";
$style="<style>td{max-width:reset}.inner td{min-width:120px} caption{margin-bottom:5px}
.big{font-size:2em;font-weight: bolder;}
</style>";
$out=$style.$out;
$table_name="aa";
$sql="select '$out' title from $table_name";
echo $sql;
//echo $out;
file_put_contents(__DIR__."/../run/sql.txt",$sql);
file_put_contents(__DIR__."/sql.txt",$sql);
//echo fwrite($f_out,$out);
fclose($f_out);
fclose($f);

//require(__DIR__."/runsql.php");


//select * from 准考证照片打印 limit 20;
create temp table aa as
select f01,"<img src="||f02||'>' f02 from 准考证照片打印;
select '<style>td{max-width:reset}.inner td{min-width:120px} caption{margin-bottom:5px}
.big{font-size:2em;font-weight: bolder;}
</style><table class="inner" border=1 cellpadding=''6'' cellspacing=0 style="margin:10px;"><caption><strong>2024年***中学物理竞赛准考证                                <br></strong></caption>
<tr><td colspan="1"  rowspan="1"  class="" >姓名</td>  <td  class="" >'||f01||'</td>  <td colspan="4"  rowspan=4  class="" >'||f02||'</td></tr>
<tr><td colspan="1"  rowspan="1"  class="" >学校</td>  <td colspan="1"  rowspan="1"  class="" >***中学</td></tr>
<tr><td colspan="1"  rowspan="1"  class="" >考点</td>  <td colspan="1"  rowspan="1"  class="" >***中学</td></tr>
<tr><td colspan="1"  rowspan="1"  class="" >准考证号</td>  <td colspan="1"  rowspan="1"  class="" ></td></tr>
<tr><td colspan="1"  rowspan="1"  class="" >考场</td>  <td colspan="1"  rowspan="1"  class="" >***中学</td>  <td colspan="1"  rowspan="1"  class="" >座位号</td>  <td colspan="1"  rowspan="1"  class="" ></td></tr>
<tr><td colspan="1"  rowspan="1"  class="" >考试时间</td>  <td colspan="3"  class="" >2024年5月5日上午9:00~11:00</td></tr>
<tr></tr>
</table>' title from aa
Screenshot_2024-07-29-21-29-43-520_com.mmbox.xbrowser.pro.jpg

TA的精华主题

TA的得分主题

发表于 2024-7-29 21:47 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
shenjianrong163 发表于 2024-7-29 21:18
三步完成:
1.规范信息


加空行的思路非常精妙,插件也与原生域融合的很好

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-29 22:05 | 显示全部楼层
shenjianrong163 发表于 2024-7-29 21:18
三步完成:
1.规范信息

太感谢了,还帮我推荐了一个好的插件。你的这个方法很巧妙,中间插入一个空行的效果比较好理解。我不会VBA,所以你的方法对我很实用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-29 22:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-7-30 21:17 | 显示全部楼层
Option Explicit
Sub test()
    Dim ar, i&, j&, r&, wdApp As Word.Application, strFileName$, strPath$, strSaveName$, pic As Word.InlineShape
   
    strPath = ThisWorkbook.Path & "\"
    ar = [A1].CurrentRegion.Value
    For i = 2 To UBound(ar)
        strFileName = strPath & ar(i, 1)
        If Dir(strFileName) <> "" Then
            r = r + 1
            For j = 1 To UBound(ar, 2)
                ar(r, j) = ar(i, j)
            Next j
            ar(r, 1) = strFileName
        End If
    Next i
    If r = 0 Then MsgBox "没找到图片文件": Exit Sub
    ar = cutArray1(ar, 2, 0, r)
   
    strFileName = strPath & "准考证模版.docx"
    If Dir(strFileName) = "" Then MsgBox "模板文件不存在!": Exit Sub
   
    Application.ScreenUpdating = False
    On Error Resume Next
    Set wdApp = GetObject(, "Word.Application")
    If Err <> 0 Then
        Set wdApp = CreateObject("Word.Application")
        'wdApp.Visible = True
    End If
   
    With wdApp.Documents.Add
        .PageSetup.Orientation = wdOrientLandscape
        strSaveName = strPath & "生成表"
        For i = 1 To UBound(ar)
            With wdApp.Documents.Open(strFileName)
                For j = 1 To UBound(ar(i))
                    With .Tables(j)
                        .Range.Cells(3).Range.Text = ar(i)(j, 2)
                        .Range.Cells(10).Range.Text = ar(i)(j, 3)
                        Set pic = .Range.Cells(4).Range.InlineShapes.AddPicture(ar(i)(j, 1))
                        With pic
                            .LockAspectRatio = True
                            .Width = 85
                        End With
                    End With
                Next j
                .Range(0).Select
                .Range(0).Copy
                .Close False
            End With
            With wdApp.Selection
                If i <> 1 Then .InsertBreak 7
                .Paste
            End With
        Next i
        .SaveAs2 strSaveName: .Close
    End With
        
    If Err <> 0 Then wdApp.Quit
    Set wdApp = Nothing
    Application.ScreenUpdating = True
    Beep
End Sub

Function cutArray1(ByVal ar, ByVal iCutNum&, Optional _
    ByVal iHeader& = 1, Optional ByVal iEndNum& = 0) As Variant()
   
    Dim br(), cr(), i&, j&, iPosRow&, r&, k&
   
    If iEndNum = 0 Or iEndNum > UBound(ar) Then iEndNum = UBound(ar)
   
    For i = iHeader + 1 To iEndNum Step iCutNum
        iPosRow = IIf((i + iCutNum - 1) > iEndNum, (iEndNum - iHeader) Mod iCutNum, iCutNum)
        ReDim cr(1 To iPosRow + iHeader, 1 To UBound(ar, 2))
        For j = iHeader + 1 To UBound(cr)
            For k = 1 To UBound(cr, 2)
                cr(j, k) = ar(i - 1 + j - iHeader, k)
            Next k
        Next j
        For j = 1 To iHeader
            For k = 1 To UBound(cr, 2)
                cr(j, k) = ar(j, k)
            Next k
        Next j
        r = r + 1
        ReDim Preserve br(1 To r)
        br(r) = cr
    Next i
   
    cutArray1 = br
End Function

TA的精华主题

TA的得分主题

发表于 2024-7-30 21:18 | 显示全部楼层
。。。。。。。。。。。。

练习文件.rar

518.97 KB, 下载次数: 19

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-31 11:28 | 显示全部楼层
gwjkkkkk 发表于 2024-7-30 21:18
。。。。。。。。。。。。

感谢你的回复,你发上来的文件,只有生成表,但是是这样子的。 image.jpg 上面的那位才是比较好。不过也感谢你的回复。

TA的精华主题

TA的得分主题

发表于 2024-7-31 17:27 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
futc004 发表于 2024-7-31 11:28
感谢你的回复,你发上来的文件,只有生成表,但是是这样子的。上面的那位才是比较好。不过也感谢你的回复 ...

试下调整上下页边距
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-25 16:08 , Processed in 0.039098 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表