MIC Image Creator使用说明

Mic工具是用于Tizen操作系统的镜像文件制作工具,支持多种格式的镜像文件创建、转换及Chroot操作。本文介绍了Mic工具的基本使用方法,包括安装、创建不同格式的镜像文件、镜像文件格式之间的转换等,并提供了Kickstart文件的定制指南。

1 概述

Mic工具是用来给tizen制作镜像文件的工具。通过此工具,我们可以制作各位类型的镜像文件,如live CD镜像,live USB镜像,针对KVM的raw镜像,针对IVI平台的loop镜像,及chroot的fs镜像。也可以通过MIC的增加指令chroot指令,chroot into到镜像文件中。

除此之外,MIC工具还可以将上述各种镜像文件之间进行格式转换, 这是非常有用的工具。


2 安装MIC工具

使用如下指令即可安装MIC工具:

$ sudo apt-get install mic

查看MIC工具的当前版本:

$ mic --version
mic 0.19.1 (Ubuntu 12.04 precise)

3 MIC工具的使用方法

MIC工具主要提供三种功能:

  • 创建不同格式的镜像文件
  • 将镜像文件从一种格式转换到另一种格式
  • chroot into 到一个镜像文件中

3.1 获取MIC的帮助信息

你可以使用$ mic --help指令或$ mic <subcmd> --help指令来获取MIC工具的帮助信息。

以下是几种获取MIC帮助信息的方法:

  • $ man mic
  • mic --help
  • mic create --help
  • mic help create
  • mic create loop --help
  • mic create help loop

3.2 MIC支持的几种镜像文件格式

3.2.1 Loop

1> 第一个Loop对应着的一个分区

2> 一个Loop镜像文件内包含着一个文件系统.

3> 在一个kickstartfile文件中可描述多个分区,针对这种情况,mic工具将会生成多个Loop镜像文件。

4> 多个Loop镜像文件可以打包成一个archive文件。


3.2.2 Raw

1> Raw有点像硬盘数据。

2> 包含分区表和所有分区。

3> 可以直接启动此类型镜像。


3.2.3 Livecd/liveusb

主要用于ia32,可以将其烧录到CD或U盘


3.2.4 fs

1> fs即文件系统。

2> MIC工具可以安装所有的tizen文件到一指定目录,此目录可直接用作chroot目录。


4 制作镜像文件

4.1 基本使用

4.1.1 创建镜像文件的指令

如下:

mic create(cr) SUBCOMMAND <ksfile> [OPTION]

4.1.2 指定镜像文件格式类型子命令

 help(?)            give detailed help on a specific sub-command
 fs                 create fs image, which is also a chroot directory
 livecd             create live CD image, used for CD booting
 liveusb            create live USB image, used for USB booting
 loop               create loop image, including multi-partitions
 raw                create raw image, containing multi-partitions

4.1.3 ksfile

kickstart为一简单的文本文件,它包含镜像分区, 设置, Bootloader, 安装包等,每类型都有对应的关键字。

tizen在发布时,通常会同时发布其对应的ksfile,如:http://download.tizen.org/releases/daily/2.0alpha/ivi-wayland/tizen-2.0alpha_20130522.2/images/ivi-wayland-release/ivi-wayland-release.ks

4.1.4 mic选项

   -h, --help          Show this help message and exit
   --logfile=LOGFILE   Path of logfile
   -c CONFIG, --config=CONFIG
                       Specify config file for MIC
   -k CACHEDIR, --cachedir=CACHEDIR
                       Cache directory to store downloaded files
   -o OUTDIR, --outdir=OUTDIR
                       Output directory
   -A ARCH, --arch=ARCH
                       Specify repo architecture
   --release=RID       Generate a release of RID with all necessary files.
                       When @BUILD_ID@ is contained in kickstart file, it
                       will be replaced by RID.
   --record-pkgs=RECORD_PKGS
                       Record the info of installed packages. Multiple values
                       can be specified which joined by ",", valid values:
                       "name", "content", "license", "vcs".
   --pkgmgr=PKGMGR     Specify backend package manager
   --local-pkgs-path=LOCAL_PKGS_PATH
                       Path for local pkgs(rpms) to be installed
   --pack-to=PACK_TO   Pack the images together into the specified achive,
                       extension supported: .zip, .tar, .tar.gz, .tar.bz2,
                       etc. by default, .tar will be used
   --copy-kernel       Copy kernel files from image /boot directory to the
                       image output directory.
   --install-pkgs=INSTALL_PKGS
                        Specify what type of packages to be installed, valid:
                        source, debuginfo, debugsource

4.1.5 其它选项

   --runtime=RUNTIME_MODE
                       Sets runtime mode, the default is bootstrap mode, valid
                       values: "native", "bootstrap". "native" means mic uses
                       localhost environment to create image, while "bootstrap"
                       means mic uses one tizen chroot environment to create image.
    --compress-image=COMPRESS_IMAGE (for loop & raw)
                       Sets the disk image compression. Note: The available
                       values might depend on the used filesystem type.
   --compress-disk-image=COMPRESS_IMAGE
                       Same with --compress-image
   --shrink (for loop)
                       Whether to shrink loop images to minimal size
   --generate-bmap (for raw)
                       Generate the block map file
   --fstab-entry=FSTAB_ENTRY (for raw)
                        Set fstab entry, 'name' means using device names,
                        'uuid' means using filesystem uuid

4.1.6 示例

创建一个loop镜像文件:

$ mic cr loop tizen.ks

4.2 如何创建一个镜像文件

4.2.1 准备kickstart文件

在使用MIC工具创建镜像镜像文件之前,你需要准备一个kickstart文件,这里是一个简单的kickstart文件内容:

# filename: tizen-min.ks
lang en_US.UTF-8
keyboard us
timezone --utc America/Los_Angeles

part / --size 1824 --ondisk sda --fstype=ext3

rootpw tizen
bootloader  --timeout=0  --append="rootdelay=5"

desktop --autologinuser=tizen
user --name tizen  --groups audio,video --password 'tizen'

repo --name=Tizen-base --baseurl=http://download.tizen.org/snapshots/trunk/common/latest/repos/base/ia32/packages/
repo --name=Tizen-main --baseurl=http://download.tizen.org/snapshots/trunk/common/latest/repos/main/ia32/packages/

%packages --ignoremissing
@tizen-bootstrap
%end

%post
rm -rf /var/lib/rpm/__db*
rpm --rebuilddb
%end

%post --nochroot
%end

上述的ks文件可以用来创建一个最小的tizen镜像,至于其它资料库,你可以使用网上精确的资料库地址来替换它。

例如:

repo --name=REPO-NAME --baseurl=https://username:passwd@yourrepo.com/ia32/packages/ --save  --ssl_verify=no

4.2.2 创建Loop镜像

在终端运行如下指令可创建一个loop镜像:

$ sudo mic create loop tizen-min.ks

4.3 使用本地RPM包创建镜像

也许你会问:如何安装我自己的RPM包到镜像中?以此方便我测试这些包是否正常。

在这种情况下,你可以使用本地路径。例如,你如你的hello.rpm包在本地目录localpath下,那么运行如下指令:

$ sudo mic create loop test.ks --local-pkgs-path=localpath

从输出信息中可以看到,MIC工具会告诉你hello.rpm已经被标志为已安装,它即将安装到镜像中。你必须得确保你的RPM包没在包ks文件中包含或是rpm包的版本不低于repo相相对应包的版本。

4.4 指定创建Achive的格式

MIC工具可以指定即将创建的镜像文件的achive格式,如 .zip, .tar, .tar.gz, .tar.bz2等,默认情况下为.tar格式。

$ sudo mic create loop test.ks --pack-to=@NAME@.tar.gz

4.5 chroot

此指令用来chroot into到镜像文件中,在Linux系统下,它是一个非常有用的加强指令。

4.5.1 使用

mic chroot(ch) <imgfile>

4.5.2 选项

   -h, --help          Show this help message and exit
   -s SAVETO, --saveto=SAVETO
                       Save the unpacked image to a specified dir

4.5.3 示例

   mic ch loop.img
   mic ch tizen.iso
   mic ch -s tizenfs tizen.usbimg

4.6 转换

此指令用来将镜像文件从一种格式转换成另一个格式.

4.6.1 使用

  mic convert(cv) <imagefile> <destformat>

4.6.2 选项

   -h, --help   Show this help message and exit
   -S, --shell  Launch shell before packaging the converted image

4.6.3 示例

   mic cv tizen.iso liveusb
   mic cv tizen.usbimg livecd
   mic cv --shell tizen.iso liveusb

5 如何自定义镜像文件

这一章将介绍如何通过修改ks文件来订制你自己的镜像文件。你可下载kickstart文件,然后修改它,如;http://download.tizen.org/releases/daily/trunk/ivi/latest/images/ivi-min-pc/ivi-min-pc-tizen_20120926.2.ks

5.1 指定资料库

你可以指定哪个资料库用来创建镜像文件,可以包含本地的资料库:

例如:http://download.tizen.org/releases/daily/trunk/ivi/latest/images/ivi-min-pc/ivi-min-pc-tizen_20120926.2.ks

repo --name=Tizen-main --baseurl=https://download.tizen.org/snapshots/trunk/common/@BUILD_ID@/repos/main/armv7l/packages/ --save  --ssl_verify=no

repo --name=Tizen-base --baseurl=https://download.tizen.org/snapshots/trunk/common/@BUILD_ID@/repos/base/armv7l/packages/ --save  --ssl_verify=no

repo --name=mylocal--baseurl=/loca/repo/path/

5.2 指定访问repo的用户名和密码

如果远程的repo资料库需要用户名和密码,那么你得在kickstart文件中指明你的用户名和密码,如:

repo --name=REPO-NAME --baseurl=https://username:passwd@yourrepo.com/ia32/packages/ --save  --ssl_verify=no

5.3 如何增加/移除包

你可以在ks文件中的'%packages'处指明你要安装哪些包,你可以单个指出它们,也可以以组的方式指出。

关于组的定义你可以参考下载服务器中的repodata/*comps.xml 或 repodata/pattern.xml 文件,如:

http://download.tizen.org/snapshots/trunk/common/latest/repos/base/ia32/packages/repodata/

%packages必须以%end结束,也可以同时指出多个%packages,此外,单个包可能以globs方式指出,如:

 %packages
 ...
 @Tizen Core            # add a group named Tizen Core, and all the packages in this group would be added
 e17-*                  # add all the packages with name starting with "e17-"
 kernel                 # add kernel package
 nss-server.armv7hl     # add nss-server with arch armv7hl
 -passwd                # remove the package passwd
 ...
 %end

5.4 制作完镜像后自动运行脚本

在创建完镜像文件后,你也可以指出自动运行脚本,如:

%post
rpm -rebuilddb
%end

更多有关kickstart文件的信息请参考:http://fedoraproject.org/wiki/Anaconda/Kickstart





import random import string from openpyxl import load_workbook # 定义IB Modality和Series的对应关系 LOCATION = { 'APM': { 'APM': ['Others'] }, 'AW': { 'AW': ['ADVANCE AWS','Others'] }, 'CT': { 'CT': ['16Pro','32Pro','ACT & ACTs','ACT & ACTs-19IW','ACT & ACTs-20IW','ACT & ACTs-21BW','ASPIRE Plus','Apex Essential','BS 3.5M','BS 6.3M','Brivo315','Brivo325','Brivo385','CARDIOGRAPHE','CT/i','EVO','HD750','Hispeed Series','LS 6.3M','LS 7.5M','LS 8.0M','LightSpeed Plus ','LightSpeed QX/I','LightSpeed RT16','LightSpeed Ultra','Lightspeed Plus','Lightspeed Ultra','Max','NEMOTO INJECTOR','Optima 660','Optima 680E ','Optima520','Optima540','Optima620','Optima670','Optima680','Others','PETCT','Prospeed Series','REVOLUTION','REVOLUTION APEX','REVOLUTION ES','RT 580','RT590','Rev Eagle','Revolution ACE','Revolution ACE ES','Revolution Maxima ','Revolution Maxima Select','Revolution Power','SYTEC','Synergy','VCT','frontier'] }, 'DXR': { 'DXR': ['23','ACHILLES','ALPHA','AMX Explorer','Advantx LCP','CRYSTAL NOVA','D8K','DEF 320','DEF 656','DEF TEMPO','DEF120','DELTA 32','DIAMOND','DPX','DPX BRAVO','DPX DUO','DPX NT','DR-F','DR-FeiTian','DR-Mobile AMX','DR-Mobile TMX','DR-Mobile VMX','IDI','IDR','IDXA','LITE WORKFLOW','MM-Goldseal','MPH','MPX','OTHERS','Others','PACE SELECT','PERFORMA','PIXI','PRESTIGE','PRISTINA Athena','PRISTINA Hygeia','PRODIGY','PROTEUS XR','PS800','PT800','R500','RXI','SENO 2000D','SENO 500T/600T','SENO 700T','SENO 800T','SENO ADV','SENO CRYSTAL','SENO DMR','SENO DS','SENO ESS','SENO PRISTINA','SENO PRISTINA 2D','SENO PRISTINA 3D','SENOIRIS H/W + S/W','SLIHOUETTE VR','Seno Pristina option','TH600','TX3','UPRIGHT','XR200','XR220','XR240','XR316','XR515','XR575','XR6000','XR646HD','XR650','XR656','XRD'] }, 'EX': { 'EX': ['EVO'] }, 'FI': { 'FI': ['D Future','D MAX','D MAX+','D Power','D610','D710','DIQ','DISCOVERY 600 FULL','DISCOVERY 610 64SL STANDARD','DLS','DMI','DST','DSTE','DVCT','Delite','EXPLORE VISTA SR/DR PET SYSTEM','Entegra','Explore','FASTLAB','FLEX TRIMODALITY','MINItrace','Others','PETtrace','RP COMECER HOT CELLS RELATED','TL FXC-ME 115V','TL FXF-E 115V','TL FXF-N 115V','TL MXFDG 115V','TRACERCENTER-HOTCELLS','TRACERLAB FX','TRIUMPH TRIMODALITY W/LABPET4','XELERIS-PET'] }, 'IIS': { 'IIS': ['IIS','Others'] }, 'Intervention': { 'Intervention': ['Advantx LCP','IGS 323','IGS 330','IGS 3Eng','IGS 520','IGS 530','IGS 540','IGS 620','IGS 630','IGS 730','IGS 740','INNOVA2000','Innova 2100','Innova 3100','Innova 3131','Innova 4100','LCA','LCP','OPTIMA3100','Others'] }, 'LCS': { 'LCS': ['0','1.5T HDxt','9 Series','9100C','ADU','AMPLIFIER','ANE','Aelite NXT','Aespire Series','Aestiva Series','Airborne 750i','Aisys Series','Apexpro CH','Avance Series','B1x5 Series','B650','BILISOFT','BiliSoft','Biliblanket ','Bx0 Series','Bx50','Bx50 Series','CAM','CARDIODAY','CARESCAPE Canvas D19','CARESCAPE ONE','CASE','CIC','CL/ML GE CLIENT','COMBOLAB','COMPUTER CL/ML','COMPUTER CL/ML Z440','COMPUTER CL/ML Z600 NO OS','COROMETRICS 120 SERIES','COROMETRICS 170 SERIES','COROMETRICS 250 SERIES','CSCS','CV WEB','CardioCap','CardioServ','CardioSys','Cardiosoft','Care Plus ','Carescape Bx0 Series','Carescape Bx50 Series','Carescape R860','Carestation 30','Carestation 6x0 Series','Carestation 7x0 Series','Centiva/5','Combolab','Dash Monitors','E Modules','E modules','E-MASIMO-00, MASIMO SAT MODULE','EBIKE','Eagle Series','Engstrom','F0 Dock','GIRAFFE RESUS','GIRAFFE SHUTTLE','Gateway','Giraffe Blue Spot PT','Giraffe Incubator','Giraffe Incubator Carestation','Giraffe Omnibed','Giraffe Omnibed Carestation','Giraffe Spot Phototherapy','Giraffe Warmer','Glight','Graffe Shuttle','IEB','IVENT 101','IWS','Incubator','Invasive Controller','LED EXAM','LULLABY RESUS','Lullaby PT','Lullaby Warmer','M Modules','MAC 1200','MAC 1600','MAC 2000','MAC 3500','MAC 400','MAC 5','MAC 500','MAC 5000','MAC 5500','MAC 600','MAC 7','MAC 800','MAC C3','MAC IT','MAC LINK','MAC LITE','MAC VU360','MAC3500','MARS PC','MARS Unix','MIC','MRI Patient Monitor','MS','MUSE','Micropace','Mobile care','Navigator','PANDA IRES WARMER','PANDA IRES WARMER FREESTANDING','PANDA IRES WARMER','PDM','PDM BASE STATION','PRN 50M','PRN50','Pro 1000','Pro series','Procare series','QS','Responder','Resuscitation Unit','S/5 Monitors','SEER 1000','SEER Recorders','SERVER CL/ML INW','STIMULATOR','Solar Modules','Solar Monitors','Spectrolite','T1900','T2000','T2100','T2100-ST','T4 Transmiter','TEC 850 ISO','TELEMETRY SERVER','TONOPORT V','TUFFSAT','Tango','Teleguard system','Transfmiter','Transport Pro','UnityID','V100','VIVO x0','Vaporizer','dashport','iVent 201',' CSCS V3'] }, 'MR': { 'MR': ['0.2T','0.35T','0.3T','0.5T','1.0T','1.5T','1.5T 450','1.5T 450/450W','1.5T 450W','1.5T ARTIST','1.5T Artist','1.5T CREATOR','1.5T EXPLORER','1.5T HDE','1.5T HDxt','1.5T MR355','1.5T MR360','1.5T Non Excite','1.5T SIGNA PRIME','1.5T Signa MR355','1.5T Signa MR360','1.5T Voyager','3.0T','3.0T 750','3.0T 750W','3.0T ARCHITECT','3.0T HDX','3.0T Hero','3.0T PIONEER','3.0T Premier','MR Spinlab','MR380','Others','PET MR',' SIGNA 7.0T'] }, 'NM': { 'NM': ['530C','B615','D630','D670','D860','D870','DISCOVERY NM/CT 670 3/8X16 ASIR','DISCOVERY NM/CT 670 DR 3/8 16SL','Entegra','Hawkeye','INFINIA','MPR/MPS','MYOSPECT CARDIAC PREMUIM','NM 830 3/8','NM XELERIS 3.1 VIEW','NM XELERIS UPGRADE','NM/CT 850 3/8 ROW','O640','Optima540','SMV DST-XLI','VENTRI','VG/VH/MG','XEL4 SWUG PKG JPN','XELERIS VIEW( DESKTOP)ALT','XELERIS-NM','XPERT','Xeleris V Workstation Full'] }, 'Others': { 'Others': ['Others'] }, 'Surgery': { 'Surgery': ['IT3500','LCE','NAV','NC100','OEC 3D','OEC Elite','OEC Elite CFD','OEC ONE','OEC ONE ASD','OEC ONE CFD','OEC-Goldseal','OEC2800','OEC6600','OEC6800','OEC715','OEC7500','OEC7600','OEC7700','OEC785','OEC7900','OEC850','OEC865','OEC8800','OEC9600','OEC9800','OEC9900','OECMINIVIEW','STENO','steno'] }, 'US': { 'US': ['DPX','ECHOPAC','EchoPAC','INVENIA','Image Vault SW','LOGIQ 100','LOGIQ 180','LOGIQ 200','LOGIQ 3','LOGIQ 400','LOGIQ 5','LOGIQ 50','LOGIQ 500','LOGIQ 7','LOGIQ 700','LOGIQ 9','LOGIQ 9 BT03 100/120 NTSC','LOGIQ A1','LOGIQ A5 BT09','LOGIQ BOOK','LOGIQ C','LOGIQ C9','LOGIQ E','LOGIQ E20','LOGIQ E8','LOGIQ E9','LOGIQ F','LOGIQ F3','LOGIQ FORTIS','LOGIQ P10','LOGIQ P3','LOGIQ P5/P6','LOGIQ P7/P9','LOGIQ P8 R4','LOGIQ S6','LOGIQ S7/S8','LOGIQ TOTUS','LOGIQ V1','LOGIQ V1 V2','LOGIQ V3/V5','LOGIQBOOK','Others','System 5','VENUE','VENUE 40','VENUE 50','VENUE FIT','VENUE GO','VERSANA','VIVID Q','VIVID 3/4','VIVID 7','VIVID E','VIVID E7/E9','VIVID E80/E90/E95','VIVID I/Q','VIVID IQ','VIVID S5/S6','VIVID S60/S70','VIVID T8','VIVID T9','VOLUSON 530','VOLUSON 730','VOLUSON E10','VOLUSON E6','VOLUSON E8','VOLUSON EXPERT 18','VOLUSON EXPERT 20','VOLUSON EXPERT 22','VOLUSON EXPERT 24','VOLUSON I/E','VOLUSON P6','VOLUSON P8','VOLUSON S10','VOLUSON S6/S8','VOLUSON S8 TOUCH BT18','VOLUSON SIGNATURE 18','VOLUSON SWIFT','VSCAN','VSCAN AIR','Viewpoint','Vscan Extend','others'] } } # 生成随机数字 def test_generate_random_number(): return random.randint(1, 100) # 定义每个 sheet 对应的字段名和规则 sheet_field_rules = { 'Segmentation Management': { 'start_field': 'Type', 'Type': ['MSA', 'Non-MSA'] * 5, 'Segmentation Name': [f'TestSegmentation{test_generate_random_number()}' for _ in range(10)], 'VAT Rate(%)': [test_generate_random_number() for _ in range(10)], 'Old Segmentation Name': [f'TestSegmentationName{test_generate_random_number()}' for _ in range(10)], 'Status': ['Active', 'Inactive'] * 5, 'Description': '测试数据,可删除' }, 'Offering Management': { 'start_field': 'Segmentation Name', 'Segmentation Name': ['ZZB'] * 5,#'ZZB', 'AI','APM','ZXB','ZUB','ZUB','ZUB' 'Offering Name': [f'ZZB_Offering{test_generate_random_number()}' for _ in range(10)], 'IB Modality':list(LOCATION.keys()), '订单是否允许跨Modality':['是', '否']* 5, '标准PM次数': [test_generate_random_number() for _ in range(10)], '远程PM次数': [test_generate_random_number() for _ in range(10)], 'Old Offering Name': ['CN AI-MSA 智县域年费-订阅','CN AI-MSA 智超声年费-订阅','APM数字医工云版-年费','APM数字医工本地版-年费','APM供应商管理-年费','APM效期管理-年费','APM不良事件管理-年费','APM调剂中心-年费','APM科室调剂-年费','APM购置管理-年费','APM备件管理-年费','APM特种设备管理-年费','APM评审·质控-年费','APM等级评审-年费','APM设备质控-年费','APM无人值守-年费','APM RFID智慧盘点-年费','APM大放物联绩效-年费','APM超声/窥镜物联绩效-年费','APM小设备物联绩效-年费','APM物联绩效基础包-年费','US-智享保','CT-TUI-年','CT-TUI-年+智慧球管提前订货','CT-TUI-低病人量','CT-TUI-曝光秒','CN AI-MSA 智影像年费-买断','CN AI-MSA 智县域年费-买断','CN AI-MSA 智超声年费-买断','CN AI-MSA 智影像年费-订阅','CT-智享保-A','CT-智享保-B','CT-Premium All-in(高病人量日均>=50)-A','CT-Premium All-in(高病人量日均>=50)-B','CT-Premium All-in(中病人量日均30-50)-A','CT-Premium All-in(中病人量日均30-50)-B','CT-智优保-A','CT-智优保-B','CT-智尊保','CT-智康保','低病人量','低病人量','APM评审·质控-年费','APM供应商管理-年费','CT-智优保-A','APM调剂中心-年费'] * 5, '有效期(开始时间)':'30', '有效期(结束时间)':'30', 'Status': ['Active', 'Inactive'] * 5, '订单是否允许跨End User':['是', '否']* 5, '是否取Offering价格':['是', '否']* 5, 'Group Name': [f'Group{test_generate_random_number()}' for _ in range(10)], '类型': ['Standard', 'Additional'] * 5, '标识': ['主机', 'Training','AW'] * 5, '是否使用PSI PM': ['N', 'Y'] * 5, 'Status': ['Active', 'Inactive'] * 5, 'Series_a':[], 'Series_b':[], 'List Price': [test_generate_random_number() for _ in range(10)], 'FMV': [test_generate_random_number() for _ in range(10)], 'Catalog No.':['Corrective Unlimited','Tube Watch Proactive','D3165T','D3143T'], 'CoverageType': ['Optional', 'Base'] * 5, 'Series_a':[], 'Series_b':[], 'List Price': [test_generate_random_number() for _ in range(10)], 'FMV': [test_generate_random_number() for _ in range(10)], } } # # 根据IB Modality填充Series_a和Series_b # for ib_modality in sheet_field_rules['IB Modality and Series_a']['IB Modality']: # series_as = LOCATION[ib_modality].keys() # for series_a in series_as: # sheet_field_rules['IB Modality and Series_a']['Series_a'].append(series_a) # series_bs = LOCATION[ib_modality][series_a] # for series_b in series_bs: # sheet_field_rules['IB Modality and Series_a']['Series_b'].append(series_b) # 检查键是否存在,避免 KeyError if 'IB Modality and Series_a' in sheet_field_rules: # 初始化 Series_a 和 Series_b 列表 if 'Series_a' not in sheet_field_rules['IB Modality and Series_a']: sheet_field_rules['IB Modality and Series_a']['Series_a'] = [] if 'Series_b' not in sheet_field_rules['IB Modality and Series_a']: sheet_field_rules['IB Modality and Series_a']['Series_b'] = [] # 遍历 IB Modality for ib_modality in sheet_field_rules['IB Modality and Series_a']['IB Modality']: if ib_modality in LOCATION: series_as = LOCATION[ib_modality].keys() for series_a in series_as: sheet_field_rules['IB Modality and Series_a']['Series_a'].append(series_a) if series_a in LOCATION[ib_modality]: series_bs = LOCATION[ib_modality][series_a] for series_b in series_bs: sheet_field_rules['IB Modality and Series_a']['Series_b'].append(series_b) # 加载工作簿 workbook = load_workbook('C:\\Test_GIT\\common\\case\\data\\Admin.xlsx') # 遍历每个 sheet for sheet_name, field_rules in sheet_field_rules.items(): if sheet_name in workbook.sheetnames: sheet = workbook[sheet_name] # 检查表头是否已经存在 if sheet.max_row == 0: # 写入表头 headers = list(field_rules.keys()) headers.remove('start_field') sheet.append(headers) for i in range(len(field_rules['IB Modality'])): row_data = [] start_field = field_rules['start_field'] ib_modality = field_rules[start_field][i % len(field_rules[start_field])] # 插入IB Modality row_data.append(ib_modality) # 插入对应的Seriesa和Seriesb series_as = LOCATION[ib_modality] for series_a, series_bs in series_as.items(): row_with_series = row_data.copy() row_with_series.append(series_a) for series_b in series_bs: row = row_with_series.copy() row.append(series_b) for field, values in field_rules.items(): if field not in [start_field, 'Series_a', 'Series_b']: if isinstance(values, list): row.append(values[i % len(values)]) else: row.append(values) sheet.append(row) print(f"插入数据到 Excel: {row}") # 保存修改后的工作簿到原文件路径 workbook.save('C:\\Test_GIT\\common\\case\\data\\Admin.xlsx') 解析这段代码
最新发布
09-05
《FontCreator 中文使用手册说明书》是一本专门为使用FontCreator字体编辑软件的中文用户编写的操作指南。本书详细介绍了FontCreator软件的各项功能和操作方法,旨在帮助用户快速入门并灵活运用该软件。 首先,本手册详细介绍了FontCreator软件的安装步骤及系统要求,确保用户能正确安装和运行该软件。之后,手册逐一介绍了软件主界面的各个模块,如字形编辑器、字体轮廓设计、字体属性设置等,并针对每个模块提供了简明扼要的操作说明。用户可按照手册上的指引,快速了解每个模块的功能和使用方法。 其次,手册对字形编辑器的具体使用进行了深入讲解。从载入字体文件开始,手册详细介绍了如何进行字形的创建、编辑和修改,包括描点、修改轮廓等内容。手册还介绍了如何设置字体的度量值、字间距、字重、字宽等属性,使用户能够根据自己的需求对字体进行个性化设计。 此外,手册还详细讲解了字体导入导出、字体打印和预览等相关功能,以及一些常见问题的解决方法。通过本手册的指导,用户可以更好地利用FontCreator软件进行字体设计和编辑,提高工作效率和创作效果。 综上所述,《FontCreator 中文使用手册说明书》是一本为中文用户编写的实用指南,通过详细介绍软件功能和操作步骤,帮助用户快速掌握FontCreator字体编辑软件的使用技巧,从而更好地应用于字体设计和编辑的工作中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值