diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9491a2f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,363 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Oo]ut/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
\ No newline at end of file
diff --git a/docs/000 受領物/20250804_中村様、浦崎様/20250717_溶接加工計画テーブル設計書.xlsx b/docs/000 受領物/20250804_中村様、浦崎様/20250717_溶接加工計画テーブル設計書.xlsx
new file mode 100644
index 0000000..089b1a0
Binary files /dev/null and b/docs/000 受領物/20250804_中村様、浦崎様/20250717_溶接加工計画テーブル設計書.xlsx differ
diff --git a/docs/000 受領物/20250804_中村様、浦崎様/SFTP接続例.xlsx b/docs/000 受領物/20250804_中村様、浦崎様/SFTP接続例.xlsx
new file mode 100644
index 0000000..f26fc1c
Binary files /dev/null and b/docs/000 受領物/20250804_中村様、浦崎様/SFTP接続例.xlsx differ
diff --git a/docs/000 受領物/20250804_中村様、浦崎様/溶接_加工計画ヒヤリング資料.pptx b/docs/000 受領物/20250804_中村様、浦崎様/溶接_加工計画ヒヤリング資料.pptx
new file mode 100644
index 0000000..a1158f0
Binary files /dev/null and b/docs/000 受領物/20250804_中村様、浦崎様/溶接_加工計画ヒヤリング資料.pptx differ
diff --git a/docs/000 受領物/20250919_中村様(実データ)/102期生産計画MC上期.xlsx b/docs/000 受領物/20250919_中村様(実データ)/102期生産計画MC上期.xlsx
new file mode 100644
index 0000000..41c82be
Binary files /dev/null and b/docs/000 受領物/20250919_中村様(実データ)/102期生産計画MC上期.xlsx differ
diff --git a/docs/000 受領物/20250919_中村様(実データ)/102期生産計画マルチ上期.xlsx b/docs/000 受領物/20250919_中村様(実データ)/102期生産計画マルチ上期.xlsx
new file mode 100644
index 0000000..0a616fd
Binary files /dev/null and b/docs/000 受領物/20250919_中村様(実データ)/102期生産計画マルチ上期.xlsx differ
diff --git a/docs/000 受領物/20250926_中村様(仕様変更)/20250925_溶接加工計画テーブル設計書.xlsx b/docs/000 受領物/20250926_中村様(仕様変更)/20250925_溶接加工計画テーブル設計書.xlsx
new file mode 100644
index 0000000..1b3841d
Binary files /dev/null and b/docs/000 受領物/20250926_中村様(仕様変更)/20250925_溶接加工計画テーブル設計書.xlsx differ
diff --git a/docs/000 受領物/20251022_中村様(新書式)/WE生産計画フォーマット仕様(サンプル).xlsx b/docs/000 受領物/20251022_中村様(新書式)/WE生産計画フォーマット仕様(サンプル).xlsx
new file mode 100644
index 0000000..f7e35e0
Binary files /dev/null and b/docs/000 受領物/20251022_中村様(新書式)/WE生産計画フォーマット仕様(サンプル).xlsx differ
diff --git a/docs/000 受領物/20251023_中村様(アルミ加工Excelファイル)/生産計画5月検討⊿1_ヒヤリングメモあり.xlsx b/docs/000 受領物/20251023_中村様(アルミ加工Excelファイル)/生産計画5月検討⊿1_ヒヤリングメモあり.xlsx
new file mode 100644
index 0000000..602ec92
Binary files /dev/null and b/docs/000 受領物/20251023_中村様(アルミ加工Excelファイル)/生産計画5月検討⊿1_ヒヤリングメモあり.xlsx differ
diff --git a/docs/000 受領物/20251023_中村様(アルミ加工Excelファイル)/生産計画8月0722.xlsx b/docs/000 受領物/20251023_中村様(アルミ加工Excelファイル)/生産計画8月0722.xlsx
new file mode 100644
index 0000000..9865bff
Binary files /dev/null and b/docs/000 受領物/20251023_中村様(アルミ加工Excelファイル)/生産計画8月0722.xlsx differ
diff --git a/docs/000 受領物/20251104_中村様(INIファイル)/setting.ini b/docs/000 受領物/20251104_中村様(INIファイル)/setting.ini
new file mode 100644
index 0000000..69034c9
--- /dev/null
+++ b/docs/000 受領物/20251104_中村様(INIファイル)/setting.ini
@@ -0,0 +1,218 @@
+[ExcelToCsvWeOrder]
+Title=Excel→CSV 処理(溶接加工向けデータ連携ツール)
+001=ExcelToCsv_WeOrder(ExcelToCsvIni)
+;001=ExcelToCsv_WeOrder(ExcelToCsvAlumiIni)
+002=SFTPUpload(SFTPUploadIni)
+003=Cleanup(CleanupAfterUploadIni)
+
+[ExcelToCsvIni]
+DaysToStartOffset=1
+InFolderPath=C:\CSV\read
+;InFolderPath=C:\CSV\溶接加工計画
+;FileNamePattern=*生産計画*.xlsx
+FileNamePattern=WE生産計画*.xlsx
+ExcelSheetCheckItems=D2[or]D3,ライン|E2[or]E3,シフト|C5[or]D5,機種コード[or]コード|E5,仕向|F5,タクト|G5,日付
+ExcelLineJudgeCol=D
+ExcelDateRowMode=Fixed
+ExcelDateRow=5
+ExcelDateRowStartCol=H
+ExcelDateRowEndValue=TOTAL
+ExcelHiddenRowHandling=skip
+ExcelDataStartRowJudgeCol=D
+ExcelDataStartRowJudgeValues=コード,機種,機種コード,基本部番
+ExcelDataEndJudgeCol=G
+ExcelDataEndJudgeValue=
+ExcelMcSeisanFukaJudgeCol=B
+ExcelMcSeisanFukaJudgeValuePattern=*生産負荷*
+ExcelAfWeCol=G
+OutFolderPath=C:\CSV\溶接加工計画
+CsvFileName=WeOrder
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+;CsvEncoding=UTF-8 With BOM
+
+[ExcelToCsvAlumiIni]
+DaysToStartOffset=1
+InFolderPath=C:\CSV\溶接加工計画
+FileNamePattern=*アルミ*.xlsx
+ExcelSheetCheckItems=A3,YEAR|B3,MONTH|C3,ライン名|G4[or]K4,生産計画|A7[or]A8,部番|G7[or]G8,日付|G8[or]G9,刻印
+ExcelLineJudgeCol=C
+ExcelDateRowMode=Judge
+ExcelDateRow=5
+ExcelDateRowJudgeCol=G
+ExcelDateRowJudgeValue=日付
+ExcelDateRowStartCol=H
+ExcelDateRowEndValue=TOTAL
+ExcelHiddenRowHandling=skip
+ExcelDataStartRowJudgeCol=D
+ExcelDataStartRowJudgeValues=コード,機種,機種コード,基本部番
+ExcelDataEndJudgeCol=G
+ExcelDataEndJudgeValue=
+ExcelMcSeisanFukaJudgeCol=B
+ExcelMcSeisanFukaJudgeValuePattern=*生産負荷*
+ExcelAfWeCol=G
+OutFolderPath=C:\CSV\溶接加工計画
+CsvFileName=WeOrder.csv
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+;CsvEncoding=UTF-8 With BOM
+
+[SFTPUploadIni]
+Host=10.22.6.10
+Port=22
+UserName=J0136167A
+PrivateKeyFilePath=C:\keys\J0136167A.ppk
+PassPhrase=
+RemotePath=/Test/WE_PLAN
+InFolderPath=C:\CSV\溶接加工計画
+FileNamePatterns=*.csv
+
+[CleanupAfterUploadIni]
+FolderPath=C:\CSV\SFTPDL
+MaxDays=90
+MaxFileCount=100
+
+[CsvToDbWeOrder]
+Title=CSV→DB 処理
+001=SFTPDownload(SFTPDownloadIni)
+002=CsvToDb(CsvToDbIni)
+003=Backup(BackupIni)
+;003=SFTPDelete(SFTPDeleteIni)
+004=
+
+[SFTPDownloadIni]
+Host=10.22.6.10
+Port=22
+UserName=J0136167A
+PrivateKeyFilePath=C:\keys\J0136167A.ppk
+PassPhrase={[SFTP]PassPhrase}
+RemotePath=/Test/WE_PLAN
+OutFolderPath=C:\CSV\SFTPDL
+FileNamePatterns=*WeOder*.csv
+
+[CsvToDbIni]
+SqlFolderPath=SQL
+DaysToStartOffset=1
+CsvFileNamePatterns={[CSV]FileNamePatterns}
+CsvFolderPath=C:\CSV\SFTPDL
+;CsvEncoding=UTF-8 With BOM
+DbProviderName=ポスグレ
+DbConnectionString=Host=RL23091509;Port=5432;Database=vaptracedb;Username=postgres;Password=postgres
+;DbConnectionString=Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=sfsadmin
+DeleteBeforeInsertSqlFiles=DeleteBeforeInsertWeOrder
+InsertSqlFiles=InsertWeOrder
+DupCheckSqlFiles=
+
+[SFTPDeleteIni]
+Host={[SFTP]Host}
+Port={[SFTP]Port}
+UserName={[SFTP]UserName}
+PrivateKeyFilePath={[SFTP]PrivateKeyFilePath}
+PassPhrase={[SFTP]PassPhrase}
+RemotePath={[SFTP]RemotePath}
+FileNamePatterns={[CSV]FileNamePatterns}
+
+[BackupIni]
+SourceFolderPath=C:\CSV\SFTPDL
+DestinationFolderPath=C:\SFTPCSV\DL\Backup001
+FileNamePatterns=*WeOrder*.csv
+MaxDays=30
+MaxFileCount=30
+PrefixDtFormat=yyyy-MM-dd-HH-mm-ss_
+SuffixDtFormat=_yyyyMMddHHmmss
+[Logging]
+LogLevel=Information
+LogFilePath=Log\ExcelToCsvToDbLog.log
+RollingInterval=Month
+
+[SFTP]
+Host=172.22.4.89
+Port=22
+UserName=noboru
+PrivateKeyFilePath=C:\Users\jpa01378\id_rsa_dotnet
+PassPhrase=uI14MRtLpR7iLxWvaTGFfw==
+RemotePath=bbb
+
+[CSV]
+FileNamePatterns=*WeOrder*.csv
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;[ExcelToCsvIniあああああ]
+;Title=Excel→CSV 処理(溶接加工向けデータ連携ツール)
+;DaysToStartOffset=1
+;InFolder=C:\CSV\溶接加工計画
+;InFileName=2023*_溶接加工計画.xlsx
+;InFileName=*生産計画*.xlsx
+;ExcelSheetCheckItems=2,5,ライン|2,6,シフト|5,3,機種コード|5,5,部番
+;ExcelSheetCheckItems=D2[or]D1,ライン|E2[or]E1,シフト|D5,機種コード[or]コード|E5,仕向|F5,タクト|G5,日付
+;ExcelLineJudgeCol=4
+;ExcelDateRow=5
+;ExcelHiddenRowHandling=skip
+;ExcelDateRowStartCol=9
+;ExcelDateRowStartCol=8
+;ExcelDateRowEndValue=TOTAL
+;ExcelDataStartRow=6
+;ExcelDataEndJudgeCol=8
+;ExcelDataEndJudgeCol=7
+;ExcelDataEndJudgeValue=
+;ExcelMcSeisanFukaRowJudgeCol=2
+;ExcelMcSeisanFukaRowJudgeValues=MC生産負荷(2交替),マルチ生産負荷(2交替)
+;ExcelMcSeisanFukaRowJudgeValuePattern=*生産負荷*
+;NameToIdListForLine=MC,57|MULTI,58|50号機,50|マルチ,58|RFS/A,901|T/T,902
+;ExcelAfWeCol=8
+;ExcelAfWeCol=7
+;CsvTempFolder=C:\CSV\溶接加工計画
+;CsvFileNameTactManagement=TactManagement.csv
+;CsvFileNameWeOrder=WeOrder
+;FileDtPrefix=yyyyMMdd-HHmmss_
+;FileDtSuffix=_yyyyMMdd_HHmmss
+;CsvEncoding=UTF-8 With BOM
+;[CsvToDb]
+;Title=CSV to DB 処理(溶接加工向けデータ連携ツール)
+;DaysToStartOffset=2
+;CsvFileNamePatterns=*TactManagement*.csv,*WeOrder*.csv
+;CsvFileNamePatterns=*WeOrder*.csv
+;CsvTempFolder=C:\CSV\DL
+;CsvEncoding=UTF-8 With BOM
+;DbProviderName=ポスグレ
+;DbConnectionString=Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=sfsadmin
+;DbConnectionString=Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=sfsadmin;ENCODING=SJIS
+;DeleteBeforeInsertSqlFiles=,DeleteBeforeInsertWeOrder
+;DeleteBeforeInsertSqlFiles=DeleteBeforeInsertWeOrder
+;DeleteBeforeInsertSqlFiles=DELETE FROM vap.t_weorder WHERE we_product_date >= :START_DATE;
+;InsertSqlFiles=InsertTactManagement,InsertWeOrder
+;InsertSqlFiles=InsertWeOrder
+;DupCheckSqlFiles=DupCheckTactManagement,
+;DupCheckSqlFiles=
+;ActionAfterDbRegist=BACKUP
+;[Backup]
+;SourceFolderPath=C:\CSV\DL
+;DestinationFolderPath=C:\CSV\DL\Backup001
+;FileNamePatterns=*TactManagement*.csv,*WeOrder*.csv
+;FileNamePatterns=*WeOrder*.csv
+;MaxDays=30
+;MaxFileCount=30
+;PrefixDtFormat=yyyy-MM-dd-HH-mm-ss_
+;SuffixDtFormat=_yyyyMMddHHmmss
+;[SFTP]
+;Host=aaaaaaa
+;Host=172.316.137 // 先週のアドレス!
+;Host=172.23.86.69
+;Port=5432
+;Port=22
+;UserName=aaaa
+;UserName=noboru
+;PrivateKeyFilePath=C:\Users\jpa01378\id_rsa_dotnetああああああ
+;PrivateKeyFilePath=C:\Users\jpa01378\id_rsa_dotnet
+;PassPhrase=bbbbb
+;PassPhrase=uI14MRtLpR7iLxWvaTGFfw==
+;RemotePath=bbb
+;InFolderPath=C:\CSV\溶接加工計画
+;OutFolderPath=C:\CSV\DL
+;FileNamePatterns=*WeOrder*.csv
+;ActionAfterSFTPDownload=DELETE
+;ActionAfterSFTPUpload=CLEANUP(Cleanup)
+;[Cleanup]
+;FolderPath=C:\CSV\DL
+;MaxDays=7
+;MaxFileCount=100
diff --git a/docs/000 受領物/20251117_中村様(新溶接1ライン)/【新溶接1ライン】102期 12月溶接1計画.xlsx b/docs/000 受領物/20251117_中村様(新溶接1ライン)/【新溶接1ライン】102期 12月溶接1計画.xlsx
new file mode 100644
index 0000000..3b66fbe
Binary files /dev/null and b/docs/000 受領物/20251117_中村様(新溶接1ライン)/【新溶接1ライン】102期 12月溶接1計画.xlsx differ
diff --git a/docs/000 受領物/20260108_瀧様(新Excel書式)/★【20260105】溶接鉄フレーム生産計画_2025_1226 周寳改.xlsm b/docs/000 受領物/20260108_瀧様(新Excel書式)/★【20260105】溶接鉄フレーム生産計画_2025_1226 周寳改.xlsm
new file mode 100644
index 0000000..83707e8
Binary files /dev/null and b/docs/000 受領物/20260108_瀧様(新Excel書式)/★【20260105】溶接鉄フレーム生産計画_2025_1226 周寳改.xlsm differ
diff --git a/docs/000 受領物/20260304_中村様(SPのExcel)/SP計画2026-02.xlsx b/docs/000 受領物/20260304_中村様(SPのExcel)/SP計画2026-02.xlsx
new file mode 100644
index 0000000..20a6e29
Binary files /dev/null and b/docs/000 受領物/20260304_中村様(SPのExcel)/SP計画2026-02.xlsx differ
diff --git a/docs/000 受領物/20260304_中村様(SPのExcel)/SP計画2026-02(加工).xlsx b/docs/000 受領物/20260304_中村様(SPのExcel)/SP計画2026-02(加工).xlsx
new file mode 100644
index 0000000..20a6e29
Binary files /dev/null and b/docs/000 受領物/20260304_中村様(SPのExcel)/SP計画2026-02(加工).xlsx differ
diff --git a/docs/000 受領物/20260306_中村様(SP仕様書)/SP計画2026-02_仕様書.xlsx b/docs/000 受領物/20260306_中村様(SP仕様書)/SP計画2026-02_仕様書.xlsx
new file mode 100644
index 0000000..5d6cbe2
Binary files /dev/null and b/docs/000 受領物/20260306_中村様(SP仕様書)/SP計画2026-02_仕様書.xlsx differ
diff --git a/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/20260314-165519_WeOrderNewFormat_20260314_165519.csv b/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/20260314-165519_WeOrderNewFormat_20260314_165519.csv
new file mode 100644
index 0000000..e0b7a91
--- /dev/null
+++ b/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/20260314-165519_WeOrderNewFormat_20260314_165519.csv
@@ -0,0 +1,131 @@
+"create_record_date","line_id","line_name","basic_parts_no","work_date","af_amount","we_amount","kd_we_amount","production_lur","model_cd","derivation","tact_time"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/16 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/17 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/19 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/20 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/21 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/23 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/24 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","105","RF,S/A","50100K88 B500","2026/03/25 0:00:00","0","200","0","0","K88","AF","110"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/16 0:00:00","0","187","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/17 0:00:00","0","191","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/18 0:00:00","0","192","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/19 0:00:00","0","184","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/20 0:00:00","0","181","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/21 0:00:00","0","169","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/23 0:00:00","0","172","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/24 0:00:00","0","161","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","106","T/T","RRCMPMKT D700","2026/03/25 0:00:00","0","172","0","0","MKT","AF","180"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/16 0:00:00","0","185","0","94","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/17 0:00:00","0","187","0","98","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/18 0:00:00","0","101","0","87","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/19 0:00:00","0","132","0","96","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/20 0:00:00","0","184","0","99","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/21 0:00:00","0","61","0","95","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/23 0:00:00","0","79","0","90","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/24 0:00:00","0","52","0","96","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/25 0:00:00","0","71","0","89","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKT D700","2026/03/26 0:00:00","0","82","0","93","MKT","AF","155"
+"2026/03/14 16:55:14","64","マルチ","50100MKW D700","2026/03/21 0:00:00","0","66","0","95","MKW","","0"
+"2026/03/14 16:55:14","64","マルチ","50100MKW D700","2026/03/23 0:00:00","0","77","0","90","MKW","","0"
+"2026/03/14 16:55:14","64","マルチ","50100MKW D700","2026/03/24 0:00:00","0","77","0","96","MKW","","0"
+"2026/03/14 16:55:14","64","マルチ","50100MKW D700","2026/03/25 0:00:00","0","81","0","89","MKW","","0"
+"2026/03/14 16:55:14","64","マルチ","50100MKW D700","2026/03/26 0:00:00","0","81","0","93","MKW","","0"
+"2026/03/14 16:55:14","64","マルチ","50100MKW D700","2026/03/27 0:00:00","0","82","0","81","MKW","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/16 0:00:00","0","130","0","94","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/17 0:00:00","0","140","0","98","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/18 0:00:00","0","200","0","87","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/19 0:00:00","0","200","0","96","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/20 0:00:00","0","150","0","99","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/21 0:00:00","0","200","0","95","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/23 0:00:00","0","150","0","90","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/24 0:00:00","0","200","0","96","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/25 0:00:00","0","150","0","89","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/26 0:00:00","0","150","0","93","K88","","0"
+"2026/03/14 16:55:14","64","マルチ","50100K88 B500","2026/03/27 0:00:00","0","200","0","81","K88","","0"
+"2026/03/14 16:55:14","65","MC","50100MFP JD00","2026/03/16 0:00:00","0","15","0","99","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MFP JD00","2026/03/19 0:00:00","0","15","0","91","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MFP JD00","2026/03/21 0:00:00","0","15","0","90","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MFP JD00","2026/03/24 0:00:00","0","14","0","94","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MFP JD00","2026/03/25 0:00:00","0","14","0","82","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MFP JC00","2026/03/17 0:00:00","0","16","0","96","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MFP JC00","2026/03/20 0:00:00","0","15","0","86","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MFP JC00","2026/03/23 0:00:00","0","15","0","100","MFP","AF","294"
+"2026/03/14 16:55:14","65","MC","50100MKS E000","2026/03/16 0:00:00","0","30","0","99","MKS","AF","160"
+"2026/03/14 16:55:14","65","MC","50100MKS E000","2026/03/17 0:00:00","0","60","0","96","MKS","AF","160"
+"2026/03/14 16:55:14","65","MC","50100KSE 0000","2026/03/16 0:00:00","0","72","0","99","KSE","AF","0"
+"2026/03/14 16:55:14","65","MC","50100KSE 0000","2026/03/17 0:00:00","0","72","0","96","KSE","AF","0"
+"2026/03/14 16:55:14","65","MC","50100KSE 0000","2026/03/18 0:00:00","0","72","0","72","KSE","AF","0"
+"2026/03/14 16:55:14","65","MC","50100KSE 0000","2026/03/20 0:00:00","0","72","0","86","KSE","AF","0"
+"2026/03/14 16:55:14","65","MC","50100KSE 0000","2026/03/21 0:00:00","0","70","0","90","KSE","AF","0"
+"2026/03/14 16:55:14","65","MC","50100KSE 0000","2026/03/23 0:00:00","0","56","0","100","KSE","AF","0"
+"2026/03/14 16:55:14","65","MC","50100KSE 0000","2026/03/24 0:00:00","0","47","0","94","KSE","AF","0"
+"2026/03/14 16:55:14","65","MC","50100MKT D700","2026/03/18 0:00:00","0","90","0","72","MKT","AF","131"
+"2026/03/14 16:55:14","65","MC","50100MKT D700","2026/03/19 0:00:00","0","60","0","91","MKT","AF","131"
+"2026/03/14 16:55:14","65","MC","50100MKT D700","2026/03/21 0:00:00","0","120","0","90","MKT","AF","131"
+"2026/03/14 16:55:14","65","MC","50100MKT D700","2026/03/23 0:00:00","0","90","0","100","MKT","AF","131"
+"2026/03/14 16:55:14","65","MC","50100MKT D700","2026/03/24 0:00:00","0","120","0","94","MKT","AF","131"
+"2026/03/14 16:55:14","65","MC","50100MKT D700","2026/03/25 0:00:00","0","90","0","82","MKT","AF","131"
+"2026/03/14 16:55:14","65","MC","50100MKT D700","2026/03/26 0:00:00","0","90","0","82","MKT","AF","131"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/16 0:00:00","0","89","0","99","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/17 0:00:00","0","54","0","96","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/18 0:00:00","0","35","0","72","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/19 0:00:00","0","59","0","91","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/20 0:00:00","0","99","0","86","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/21 0:00:00","0","11","0","90","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/23 0:00:00","0","49","0","100","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/24 0:00:00","0","19","0","94","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/25 0:00:00","0","24","0","82","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/26 0:00:00","0","49","0","82","MLA","AF","167"
+"2026/03/14 16:55:14","65","MC","50100MLA AA00","2026/03/27 0:00:00","0","70","0","48","MLA","AF","167"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/16 0:00:00","0","82","0","94","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/17 0:00:00","0","52","0","100","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/18 0:00:00","0","99","0","94","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/19 0:00:00","0","112","0","95","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/20 0:00:00","0","112","15","99","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/21 0:00:00","0","112","15","96","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/23 0:00:00","0","143","0","94","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/24 0:00:00","0","127","0","97","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/25 0:00:00","0","82","0","97","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/26 0:00:00","0","97","0","97","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MKS E000","2026/03/27 0:00:00","0","70","0","34","MKS","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/18 0:00:00","0","25","0","94","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/19 0:00:00","0","52","0","95","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/20 0:00:00","0","26","0","99","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/21 0:00:00","0","25","0","96","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/23 0:00:00","0","27","0","94","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/24 0:00:00","0","25","0","97","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/25 0:00:00","0","27","0","97","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLF E800","2026/03/26 0:00:00","0","29","0","97","MLF","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLZ E900","2026/03/18 0:00:00","0","16","0","94","MLZ","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLL DA00","2026/03/17 0:00:00","0","32","0","100","MLL","AF","180"
+"2026/03/14 16:55:14","66","溶接1","50100MLV J000","2026/03/21 0:00:00","0","10","0","96","MLV","AF","150"
+"2026/03/14 16:55:14","66","溶接1","50100MLV J000","2026/03/23 0:00:00","0","15","0","94","MLV","AF","150"
+"2026/03/14 16:55:14","66","溶接1","50100MLV J000","2026/03/24 0:00:00","0","30","0","97","MLV","AF","150"
+"2026/03/14 16:55:14","66","溶接1","50100MLV J000","2026/03/25 0:00:00","0","40","0","97","MLV","AF","150"
+"2026/03/14 16:55:14","66","溶接1","50100MLV J000","2026/03/26 0:00:00","0","50","0","97","MLV","AF","150"
+"2026/03/14 16:55:14","66","溶接1","50100MLV J000","2026/03/27 0:00:00","0","15","0","34","MLV","AF","150"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/16 0:00:00","0","76","0","94","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/17 0:00:00","0","116","0","100","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/18 0:00:00","0","52","0","94","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/20 0:00:00","0","98","0","99","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/21 0:00:00","0","56","0","96","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/23 0:00:00","0","62","0","94","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/24 0:00:00","0","70","0","97","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/25 0:00:00","0","120","0","97","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLB D800","2026/03/26 0:00:00","0","91","0","97","MLB","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D300","2026/03/20 0:00:00","0","10","0","99","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D300","2026/03/21 0:00:00","0","13","0","96","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D300","2026/03/16 0:00:00","0","0","30","94","MLC","KD","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D300","2026/03/19 0:00:00","0","0","30","95","MLC","KD","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/16 0:00:00","0","165","0","94","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/17 0:00:00","0","163","0","100","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/18 0:00:00","0","159","0","94","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/19 0:00:00","0","161","0","95","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/20 0:00:00","0","112","0","99","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/21 0:00:00","0","126","0","96","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/23 0:00:00","0","105","0","94","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/24 0:00:00","0","108","0","97","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/25 0:00:00","0","89","0","97","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/26 0:00:00","0","90","0","97","MLC","AF","130"
+"2026/03/14 16:55:14","66","溶接1","50100MLC D600","2026/03/27 0:00:00","0","42","0","34","MLC","AF","130"
diff --git a/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/20260316_結果@小佐井さんへ.xlsx b/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/20260316_結果@小佐井さんへ.xlsx
new file mode 100644
index 0000000..af41bb6
Binary files /dev/null and b/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/20260316_結果@小佐井さんへ.xlsx differ
diff --git a/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/★【2026 3月 前倒し込み負荷 2W確定】溶接鉄フレーム生産計画_2026_0221 1.xlsm b/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/★【2026 3月 前倒し込み負荷 2W確定】溶接鉄フレーム生産計画_2026_0221 1.xlsm
new file mode 100644
index 0000000..52bd56e
Binary files /dev/null and b/docs/000 受領物/20260316_瀧様(新書式でWEが出てない)/★【2026 3月 前倒し込み負荷 2W確定】溶接鉄フレーム生産計画_2026_0221 1.xlsm differ
diff --git a/docs/000 受領物/20260401_中村様(SP仕様とデータ)/SP計画2026-02_仕様書_v2.xlsx b/docs/000 受領物/20260401_中村様(SP仕様とデータ)/SP計画2026-02_仕様書_v2.xlsx
new file mode 100644
index 0000000..b63730e
Binary files /dev/null and b/docs/000 受領物/20260401_中村様(SP仕様とデータ)/SP計画2026-02_仕様書_v2.xlsx differ
diff --git a/docs/000 受領物/20260401_中村様(SP仕様とデータ)/SP計画2026-03.xlsx b/docs/000 受領物/20260401_中村様(SP仕様とデータ)/SP計画2026-03.xlsx
new file mode 100644
index 0000000..e0defe6
Binary files /dev/null and b/docs/000 受領物/20260401_中村様(SP仕様とデータ)/SP計画2026-03.xlsx differ
diff --git a/docs/010 設計書/【溶接加工向けデータ連携ツール】マニュアル_20251119A_破損?.xlsx b/docs/010 設計書/【溶接加工向けデータ連携ツール】マニュアル_20251119A_破損?.xlsx
new file mode 100644
index 0000000..ae1fb5d
Binary files /dev/null and b/docs/010 設計書/【溶接加工向けデータ連携ツール】マニュアル_20251119A_破損?.xlsx differ
diff --git a/docs/010 設計書/【溶接加工向けデータ連携ツール】マニュアル_20260213A.xlsx b/docs/010 設計書/【溶接加工向けデータ連携ツール】マニュアル_20260213A.xlsx
new file mode 100644
index 0000000..4f15d9c
Binary files /dev/null and b/docs/010 設計書/【溶接加工向けデータ連携ツール】マニュアル_20260213A.xlsx differ
diff --git a/docs/040 テスト仕様書/20251022中村様新書式.xlsx b/docs/040 テスト仕様書/20251022中村様新書式.xlsx
new file mode 100644
index 0000000..3a3b6cb
Binary files /dev/null and b/docs/040 テスト仕様書/20251022中村様新書式.xlsx differ
diff --git a/docs/040 テスト仕様書/20260120_新共通書式対応.xlsx b/docs/040 テスト仕様書/20260120_新共通書式対応.xlsx
new file mode 100644
index 0000000..3e3e380
Binary files /dev/null and b/docs/040 テスト仕様書/20260120_新共通書式対応.xlsx differ
diff --git a/docs/040 テスト仕様書/【溶接加工向けデータ連携ツール】単体試験仕様書・成績書_20251106A.xlsx b/docs/040 テスト仕様書/【溶接加工向けデータ連携ツール】単体試験仕様書・成績書_20251106A.xlsx
new file mode 100644
index 0000000..e6dfab7
Binary files /dev/null and b/docs/040 テスト仕様書/【溶接加工向けデータ連携ツール】単体試験仕様書・成績書_20251106A.xlsx differ
diff --git a/docs/040 テスト仕様書/検証用:102期生産計画MC上期.xlsx b/docs/040 テスト仕様書/検証用:102期生産計画MC上期.xlsx
new file mode 100644
index 0000000..356935b
Binary files /dev/null and b/docs/040 テスト仕様書/検証用:102期生産計画MC上期.xlsx differ
diff --git a/docs/040 テスト仕様書/検証用:102期生産計画マルチ上期.xlsx b/docs/040 テスト仕様書/検証用:102期生産計画マルチ上期.xlsx
new file mode 100644
index 0000000..8424a7d
Binary files /dev/null and b/docs/040 テスト仕様書/検証用:102期生産計画マルチ上期.xlsx differ
diff --git a/docs/050 バッチ/CsvToDb.bat b/docs/050 バッチ/CsvToDb.bat
new file mode 100644
index 0000000..df95e62
--- /dev/null
+++ b/docs/050 バッチ/CsvToDb.bat
@@ -0,0 +1 @@
+c:\aaa\bbb\ExcelToCsvToDb.exe /CsvToDbWeOrder
diff --git a/docs/050 バッチ/ExcelToCsv.bat b/docs/050 バッチ/ExcelToCsv.bat
new file mode 100644
index 0000000..71d2fc5
--- /dev/null
+++ b/docs/050 バッチ/ExcelToCsv.bat
@@ -0,0 +1 @@
+c:\aaa\bbb\ExcelToCsvToDb.exe /ExcelToCsvWeOrderMc
diff --git a/docs/060 データ/20260310-163249_PoSpPlan_20260310_163249.csv b/docs/060 データ/20260310-163249_PoSpPlan_20260310_163249.csv
new file mode 100644
index 0000000..311989f
--- /dev/null
+++ b/docs/060 データ/20260310-163249_PoSpPlan_20260310_163249.csv
@@ -0,0 +1,622 @@
+PlanCd,HaraiMoto,HaraiSaki,ModelCd,SeppenBuban,TargetColor,KakoColor,Biko,Buhinmei,KoteiCd,SeisanHiduke,Daisu,SpBuban
+"K*SP**","PO","AF","K88","53215K88 J000 03","NH388","NH388","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/20","10","53215K88J00ZD"
+"K*SP**","PO","AF","K88","53215K88 J000 03","PB394M","PB394M","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/06","20","53215K88J00ZC"
+"K*SP**","PO","AF","K88","53215K88 J000 03","Y124P","Y124P","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/19","10","53215K88J00ZA"
+"K*SP**","PO","AF","K88","53215K88 J000 03","Y163P","Y163P","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/09","5","53215K88J00ZK"
+"K*SP**","PO","AF","MKA1.3","61100MGS D301 02","NHB01","NHB01","1・3型","FENDER COMP,FR","1521","2026/02/04","25","61100MGSD30ZF"
+"K*SP**","PO","AF","K88","61500K88 J001","Y163P","Y163P","スタンダード","COVER ASSY,R FR FORK","1521","2026/02/06","5","61500K88J00ZL"
+"K*SP**","PO","AF","K88","61500K88 J001","YR211","YR211","スタンダード","COVER ASSY,R FR FORK","1521","2026/02/18","10","61500K88J00ZB"
+"K*SP**","PO","AF","K88","61600K88 J001","Y163P","Y163P","スタンダード","COVER ASSY,L FR FORK","1521","2026/02/09","10","61600K88J00ZL"
+"K*SP**","PO","AF","K88","61600K88 J001","YR211","YR211","スタンダード","COVER ASSY,L FR FORK","1521","2026/02/19","10","61600K88J00ZB"
+"K*SP**","PO","AF","MKYJ","64100MKY E000","NHA86M","NHA86M","MKY E000AA","COWL COMP,FR UPPER","1521","2026/02/19","5","64100MKYE00ZB"
+"K*SP**","PO","AF","MLA","64205MLA A301 01","NHC65M","NHC65M","0","COWL ASSY,FR","1521","2026/02/12","15","64205MLAA30ZD"
+"K*SP**","PO","AF","MLA","64300MLA AH00 02","NHC47P","NHC47P","","COWL ASSY,HEAD LIGHT","1521","2026/02/09","20","64300MLAAH0ZD"
+"K*SP**","PO","AF","MLN4","64300MLN ER00","NHC64M","NHC64M","4型 8A ストのみ","COWL ASSY,R MIDDLE","1521","2026/02/06","15","64300MLNER0ZA"
+"K*SP**","PO","AF","MLN4","64300MLN ET00 01","NHB53P","NHB53P","4型 8A+7B ラバーなし","COWL ASSY,R MIDDLE","1521","2026/02/19","15","64300MLNET0ZA"
+"K*SP**","PO","AF","MLL","64335MLL D000 01","TYPE4","NHA86M","8A","COVER ASSY,R FUEL TANK","1521","2026/02/02","15","64335MLLD00ZA"
+"K*SP**","PO","AF","MKC","81200MKC A102","NHB70M","NHB70M","IN LID + TL_OLD","LID ASSY,TRUNK","1521","2026/02/09","10","81200MKCA10ZA"
+"K*SP**","PO","AF","MKC","81200MKC L301","NHA86M","NHA86M","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/02","5","81200MKCL30ZA"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/12","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/13","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/16","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/17","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/18","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MLA","81300MLA A300 08","NHC65M","NHC65M","LID + PANEL","SADDLEBAG ASSY,R","1521","2026/02/16","16","81300MLAA30ZC"
+"K*SP**","PO","AF","MLA","81400MLA A300 08","NHC65M","NHC65M","LID + PANEL","SADDLEBAG ASSY,L","1521","2026/02/17","20","81400MLAA30ZC"
+"K*SP**","PO","AF","MKC","81560MKC A102","NH463M","NH463M","7B (CTR+INN+END)","COVER ASSY,CTR RR TOP","1521","2026/02/04","5","81560MKCA10ZH"
+"K*SP**","PO","AF","MKC","81560MLJ A000","NHC65M","NHC65M","7B (CTR+INN+END)","COVER ASSY,CTR RR TOP","1521","2026/02/05","5","81560MLJA00ZB"
+"K*SP**","PO","AF","MKC","83105MLJ M000","TYPE1","NHA30M","7B","LID ASSY,FUEL","1521","2026/02/06","5","83105MLJM00ZA"
+"K*SP**","PO","AF","MKC","83210MKC A002","TYPE4","NHB70M","LID + BUTTON","CENTER POCKET ASSY","1521","2026/02/09","5","83210MKCA00ZF"
+"K*SP**","PO","AF","MLN1","83600MLN E300 02","TYPE2","NHB53P","1型 8A+7B","COWL ASSY,R RR SIDE","1521","2026/02/19","5","83600MLNE30ZA"
+"K*SP**","PO","AF","GAG","64300GFZ J000 02","NH138","NH138","0","COVER,SET ILLUST FRONT","1521","2026/02/04","30","64300GFZJ00ZA"
+"K*SP**","PO","AF","KSE","80010KSE 3060","TYPE1","R292R","0","FENDER SET ILLUST,REAR","1521","2026/02/03","8","80010KSE306ZA"
+"K*SP**","PO","AF","KSE","80010KSE 3060","TYPE1","R292R","0","FENDER SET ILLUST,REAR","1521","2026/02/18","7","80010KSE306ZA"
+"K*SP**","PO","AF","KSE","80101KSE A301","TYPE1","R292R","0","SET ILLUST,REAR FENDER","1521","2026/02/03","15","80101KSEA30ZA"
+"K*SP**","PO","AF","KSE","80101KSE A301","TYPE1","R292R","0","SET ILLUST,REAR FENDER","1521","2026/02/18","15","80101KSEA30ZA"
+"K*SP**","PO","AF","MKC","81100MKC L310","","","BOX LWR + BOX UPR","TRUNK SUB ASSY","1521","2026/02/09","25","81100MKCL31"
+"K*SP**","PO","AF","MKC","81100MKC L310","","","BOX LWR + BOX UPR","TRUNK SUB ASSY","1521","2026/02/25","5","81100MKCL31"
+"K*SP**","PO","AF","K88","83701K88 L203 01","T23","T23","スタンダード","COVER COMP,L BODY","1521","2026/02/04","5","83701K88L20ZA"
+"K*SP**","PO","SP","KSE","19071KSE V100","TYPE1","R292R","","SET ILLUST,R TANK SHROUD","1513","2026/02/16","5","19071KSEV10ZA"
+"K*SP**","PO","SP","MCT","50611MEF J000AB","","SOZAI","教習車","SKIRT R RLOOR(KAKOU)","1513","2026/02/25","5","50611MEFJ00AB"
+"K*SP**","PO","SP","MKE","51710MKE AU00","TYPE1","R292R","0","SET ILLUS,R FR FORK PROTECTOR","1513","2026/02/17","5","51710MKEAU0ZA"
+"K*SP**","PO","SP","KVZ","61100KVZ 6300AA","","SOZAI","0","FRONT FENDER(SOZAI)","1513","2026/02/26","5","61100KVZ630AA"
+"K*SP**","PO","SP","MFL","61100MFL 0000AB","","SOZAI","0","FENDER FRONT(SANDING)","1513","2026/02/03","5","61100MFL000AB"
+"K*SP**","PO","SP","MKA1.3","61100MGS D302AB","","SOZAI","1・3型","FENDER FR(SANDING)","1513","2026/02/02","40","61100MGSD30AB"
+"K*SP**","PO","SP","MKA1.3","61100MGS D302AB","","SOZAI","1・3型","FENDER FR(SANDING)","1513","2026/02/03","25","61100MGSD30AB"
+"K*SP**","PO","SP","MCA","61101MCA 0000AB","","SOZAI","0","FENDER,FR(SANDING)","1513","2026/02/03","5","61101MCA000AB"
+"K*SP**","PO","SP","MCA","61103MCA 0000AB","","SOZAI","0","FENDER,FR,B(SANDING)","1513","2026/02/09","40","61103MCA000AB"
+"K*SP**","PO","SP","MCA","61103MCA A80120","","SOZAI","ABS","FENDER","1513","2026/02/26","5","61103MCAA8020"
+"K*SP**","PO","SP","HP1","61110HP1 60002101","NH196","NH196","0","SHROUD,R","1513","2026/02/23","40","61110HP1600ZC"
+"K*SP**","PO","SP","HP1","61120HP1 60002101","NH196","NH196","0","FENDER,R","1513","2026/02/24","40","61120HP1600ZC"
+"K*SP**","PO","SP","V61","61151V61 J000 01","","","0","COVER,MOTOR","1513","2026/02/12","10","61151V61J00"
+"K*SP**","PO","SP","V61","61151V61 J000 01","","","0","COVER,MOTOR","1513","2026/02/13","10","61151V61J00"
+"K*SP**","PO","SP","MW3","61301MW3 A900","NH1","NH1","MFM","CASE HEAD LIGHT","1513","2026/02/09","15","61301MW3A90ZA"
+"K*SP**","PO","SP","MCA","64110MCA S400AB","","SOZAI","0","GARNISH SCREEN(SANDING)","1513","2026/02/19","10","64110MCAS40AB"
+"K*SP**","PO","SP","MKC","64110MKC A000AB","","SOZAI","","GARNISH A,SCREEN(SANDING)","1513","2026/02/26","25","64110MKCA00AB"
+"K*SP**","PO","SP","MKV","64111MKV D000AA","","SOZAI","0","COWL,FRONT(SOZAI)","1513","2026/02/20","5","64111MKVD00AA"
+"K*SP**","PO","SP","MGE","64130MGE 0000AB","","SOZAI","0","COWL R UPPER SIDE(SANDING)","1513","2026/02/11","5","64130MGE000AB"
+"K*SP**","PO","SP","MJR","64160MJR 6700AB","","SOZAI","0","COVER L FORK FR(SANDING)","1513","2026/02/16","5","64160MJR670AB"
+"K*SP**","PO","SP","MGP","64211MGP D000AB","","SOZAI","0","COWL UPPER(SANDING)","1513","2026/02/17","5","64211MGPD00AB"
+"K*SP**","PO","SP","MKT","64211MKT D000AB","","SOZAI","D000AA 旧型","COWL,UPPER(SANDING)","1513","2026/02/20","25","64211MKTD00AB"
+"K*SP**","PO","SP","MLB","64215MLB D000AB","","SOZAI","","COWL R,HEAD LIGHT SIDE(SANDING)","1513","2026/02/25","10","64215MLBD00AB"
+"K*SP**","PO","SP","MCA","64216MCA 0000AA","","SOZAI","0","COWL,FR CENTER(SOZAI)","1513","2026/02/25","5","64216MCA000AA"
+"K*SP**","PO","SP","GAG","64220GAG 7512","NH187R","NH187R","0","ROOF","1513","2026/02/04","30","64220GAG751ZB"
+"K*SP**","PO","SP","GAG","64220GAG 7512","NH187R","NH187R","0","ROOF","1513","2026/02/05","30","64220GAG751ZB"
+"K*SP**","PO","SP","MKV","64221MKV D000AA","","SOZAI","0","COVER,FR INNER(SOZAI)","1513","2026/02/20","5","64221MKVD00AA"
+"K*SP**","PO","SP","MLB","64225MLB D000AB","","SOZAI","","COWL L,HEAD LIGHT SIDE(SANDING)","1513","2026/02/12","15","64225MLBD00AB"
+"K*SP**","PO","SP","MFM","64231MFM C300AB","","SOZAI","J000AA","COWL,L SIDE(SANDING)","1513","2026/02/16","5","64231MFMC30AB"
+"K*SP**","PO","SP","MKH","64280MKH D000AB","","SOZAI","0","DUCT,R AIR(SANDING)","1513","2026/02/25","10","64280MKHD00AB"
+"K*SP**","PO","SP","MCA","64285MCA S400AB","","SOZAI","0","COWL R MIDDLE(SANDING)","1513","2026/02/13","15","64285MCAS40AB"
+"K*SP**","PO","SP","MCA","64285MCA S400AB","","SOZAI","0","COWL R MIDDLE(SANDING)","1513","2026/02/16","5","64285MCAS40AB"
+"K*SP**","PO","SP","MGS3","64290MGS D304AB","","SOZAI","旧3型","DUCT,L AIR(SANDING)","1513","2026/02/03","5","64290MGSD30AB"
+"K*SP**","PO","SP","MCA","64292MCA S400AB","","SOZAI","0","COWL L SIDE(SANDING)","1513","2026/02/18","10","64292MCAS40AB"
+"K*SP**","PO","SP","MCA","64295MCA S400AB","","SOZAI","0","COWL L MIDDLE(SANDING)","1513","2026/02/17","10","64295MCAS40AB"
+"K*SP**","PO","SP","GGZ","64301GGZ J001AA","","SOZAI","0","COVER,FR(SOZAI)","1513","2026/02/10","10","64301GGZJ00AA"
+"K*SP**","PO","SP","GJA","64301GJA J000AA","","SOZAI","0","COVER,FR(SOZAI)","1513","2026/02/10","45","64301GJAJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/16","50","64301GJBJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/17","50","64301GJBJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/18","50","64301GJBJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/19","45","64301GJBJ00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/02","25","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/03","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/04","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/05","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/06","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/09","50","64301GX1J00AA"
+"K*SP**","PO","SP","K88","64301K88 J000AA","","SOZAI","スタンダード","COVER,FRONT(SOZAI)","1513","2026/02/09","5","64301K88J00AA"
+"K*SP**","PO","SP","MCT","64301MCT 0000AA","","SOZAI","0","COVER,FR (SOZAI)","1513","2026/02/12","8","64301MCT000AA"
+"K*SP**","PO","SP","MCT","64301MCT 0000AA","","SOZAI","0","COVER,FR (SOZAI)","1513","2026/02/13","7","64301MCT000AA"
+"K*SP**","PO","SP","MFT","64301MFT 6400AA","","SOZAI","0","COVER FRONT(SOZAI)","1513","2026/02/24","5","64301MFT640AA"
+"K*SP**","PO","SP","GJB","64303GJB J000AA","","SOZAI","0","COVER,FR TOP(SOZAI)","1513","2026/02/04","10","64303GJBJ00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/02","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/03","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/04","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/05","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/06","10","64303GX1J00AA"
+"K*SP**","PO","SP","MGH","64310MGH 6400AB","","SOZAI","0","COWL R MIDDLE(SANDING)","1513","2026/02/06","15","64310MGH640AB"
+"K*SP**","PO","SP","MGP","64310MGP D000AB","","SOZAI","0","COWL,R MIDDLE(SANDING)","1513","2026/02/17","5","64310MGPD00AB"
+"K*SP**","PO","SP","MFT","64311MFT 6600","NH1","NH1","教習車用","COVER,INNER","1513","2026/02/24","5","64311MFT660ZA"
+"K*SP**","PO","SP","MKK","64311MKK D200AB","","SOZAI","0","COWL R,MIDDLE(SANDING)","1513","2026/02/24","15","64311MKKD20AB"
+"K*SP**","PO","SP","MKS1","64311MKS E000AB","","SOZAI","","COWL R,MIDDLE(SANDING)","1513","2026/02/25","5","64311MKSE00AB"
+"K*SP**","PO","SP","MKS2","64311MKS E200AB","","SOZAI","","COWL R,MIDDLE(SANDING)","1513","2026/02/18","5","64311MKSE20AB"
+"K*SP**","PO","SP","MKV","64311MKV D000AB","","SOZAI","","COWL,R FRONT SIDE(SANDING)","1513","2026/02/09","20","64311MKVD00AB"
+"K*SP**","PO","SP","MKV","64311MKV D000AB","","SOZAI","","COWL,R FRONT SIDE(SANDING)","1513","2026/02/10","20","64311MKVD00AB"
+"K*SP**","PO","SP","MLF","64311MLF E000AB","","SOZAI","","COWL,R MIDDLE COWL(SANDING)","1513","2026/02/23","15","64311MLFE00AB"
+"K*SP**","PO","SP","MLF","64311MLF E000AB","","SOZAI","","COWL,R MIDDLE COWL(SANDING)","1513","2026/02/24","20","64311MLFE00AB"
+"K*SP**","PO","SP","MKR","64312MKR D100AB","","SOZAI","","COWL,R MIDDLE(SANDING)","1513","2026/02/19","10","64312MKRD10AB"
+"K*SP**","PO","SP","MKT","64313MKT D000AB","","SOZAI","D000AA 旧型","LID,POCKET(SANDING)","1513","2026/02/20","5","64313MKTD00AB"
+"K*SP**","PO","SP","MKC","64315MKC A000AB","","SOZAI","","COWL R MIDDLE(SANDING)","1513","2026/02/02","15","64315MKCA00AB"
+"K*SP**","PO","SP","MKH","64320MKH D000AB","","SOZAI","0","COWL,R SIDE(SANDING)","1513","2026/02/16","15","64320MKHD00AB"
+"K*SP**","PO","SP","MGE","64321MGE 0000AB","","SOZAI","2次加工","COWL L MIDDLE(SANDING)","1513","2026/02/11","5","64321MGE000AB"
+"K*SP**","PO","SP","MJM","64325MJM D000AB","","SOZAI","","COWL,L MIDDLE(SANDING)","1513","2026/02/04","5","64325MJMD00AB"
+"K*SP**","PO","SP","MKC","64325MKC A000AB","","SOZAI","","COWL L,MIDDLE(SANDING)","1513","2026/02/03","15","64325MKCA00AB"
+"K*SP**","PO","SP","MKW","64330MKW DB00","TYPE2","NHC99R","DB00","SET ILLUS,R MIDDLE COWL","1513","2026/02/23","5","64330MKWDB0ZA"
+"K*SP**","PO","SP","MLB","64330MLB D000AB","","SOZAI","0","SHROUD R(SANDING)","1513","2026/02/12","30","64330MLBD00AB"
+"K*SP**","PO","SP","MLB","64330MLB D000AB","","SOZAI","0","SHROUD R(SANDING)","1513","2026/02/13","30","64330MLBD00AB"
+"K*SP**","PO","SP","MLB","64330MLB D000AB","","SOZAI","0","SHROUD R(SANDING)","1513","2026/02/16","15","64330MLBD00AB"
+"K*SP**","PO","SP","MLRR","64330MLR Y800 01","","","","COVER ASSY,R TANK","1513","2026/02/10","5","64330MLRY80"
+"K*SP**","PO","SP","MFT","64331MFT 6600AB","","SOZAI","教習車","PANEL R FLOOR SIDE(KAKOU)","1513","2026/02/23","5","64331MFT660AB"
+"K*SP**","PO","SP","KVZ","64336KVZ K102","","","0","PANEL,FR METER","1513","2026/02/03","5","64336KVZK10"
+"K*SP**","PO","SP","MKW","64340MKW DB00","TYPE2","NHC99R","DB00","SET ILLUS,L MIDDLE COWL","1513","2026/02/24","5","64340MKWDB0ZA"
+"K*SP**","PO","SP","MLB","64340MLB D000AB","","SOZAI","","SHROUD L(SANDING)","1513","2026/02/19","30","64340MLBD00AB"
+"K*SP**","PO","SP","MKW","64341MKW D000AB","","SOZAI","0","COWL A,L MIDDLE(SANDING)","1513","2026/02/03","5","64341MKWD00AB"
+"K*SP**","PO","SP","MLC","64341MLC D000AB","","SOZAI","","COWL,R SIDE(SANDING)","1513","2026/02/06","10","64341MLCD00AB"
+"K*SP**","PO","SP","MGH","64360MGH 6400AB","","SOZAI","0","COWL L MIDDLE(SANDING)","1513","2026/02/19","5","64360MGH640AB"
+"K*SP**","PO","SP","MGP","64360MGP D000AB","","SOZAI","0","COWL L MIDDLE(SANDING)","1513","2026/02/18","5","64360MGPD00AB"
+"K*SP**","PO","SP","MJC","64360MJC A001AB","","SOZAI","0","COWL,L MIDDLE(SANDING)","1513","2026/02/02","5","64360MJCA00AB"
+"K*SP**","PO","SP","MLRR","64360MLR Y800 01","","","","COVER ASSY,L TANK","1513","2026/02/11","15","64360MLRY80"
+"K*SP**","PO","SP","MJP","64361MJP G501AB01","","SOZAI","0","COWL,L MIDDLE(SANDING)","1513","2026/02/02","20","64361MJPG50AB"
+"K*SP**","PO","SP","MKV","64361MKV D000AB","","SOZAI","0","COWL,L FRONT SIDE(SANDING)","1513","2026/02/24","30","64361MKVD00AB"
+"K*SP**","PO","SP","MLF","64361MLF E000AB","","SOZAI","","COWL L MIDDLE(SANDING)","1513","2026/02/25","20","64361MLFE00AB"
+"K*SP**","PO","SP","MLF","64361MLF E000AB","","SOZAI","","COWL L MIDDLE(SANDING)","1513","2026/02/26","20","64361MLFE00AB"
+"K*SP**","PO","SP","MKH","64370MKH D000AB","","SOZAI","0","COWL,L SIDE(SANDING)","1513","2026/02/17","10","64370MKHD00AB"
+"K*SP**","PO","SP","MKF","64406MKF D400AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/04","5","64406MKFD40AB"
+"K*SP**","PO","SP","MFJ","64410MFJ A400AB","","SOZAI","MFJH新型","COWL,R UNDER(SANDING)","1513","2026/02/04","10","64410MFJA40AB"
+"K*SP**","PO","SP","MGP","64410MGP D000AB","","SOZAI","0","COWL R UNDER(SANDING)","1513","2026/02/17","5","64410MGPD00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/03","15","64410MJCA00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/04","20","64410MJCA00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/05","20","64410MJCA00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/06","20","64410MJCA00AB"
+"K*SP**","PO","SP","MKA2","64410MJL D700AB","","SOZAI","MKA","SKIRT R FRONT FLOOR(SANDING)","1513","2026/02/09","5","64410MJLD70AB"
+"K*SP**","PO","SP","MGH","64460MGH 6400AB","","SOZAI","0","COWL L UNDER(SANDING)","1513","2026/02/19","5","64460MGH640AB"
+"K*SP**","PO","SP","MGP","64460MGP D000AB","","SOZAI","0","COWL,L UNDER(SANDING)","1513","2026/02/18","5","64460MGPD00AB"
+"K*SP**","PO","SP","MJC","64460MJC A000AB","","SOZAI","","COWL,L UNDER(SANDING)","1513","2026/02/02","5","64460MJCA00AB"
+"K*SP**","PO","SP","MKH","64460MKH D000AA","","SOZAI","0","COVER,L SKIRT(SOZAI)","1513","2026/02/17","10","64460MKHD00AA"
+"K*SP**","PO","SP","MGE","64471MGE 0000AB","","SOZAI","0","COVER R FUEL TANK(SANDING)","1513","2026/02/11","5","64471MGE000AB"
+"K*SP**","PO","SP","MKT","64471MKT D000AA","","SOZAI","D000AA","COVER,L SKIRT(SOZAI)","1513","2026/02/20","25","64471MKTD00AA"
+"K*SP**","PO","SP","MCA","64501MCA A601","","","0","COWL,CTR INNER","1513","2026/02/06","15","64501MCAA60"
+"K*SP**","PO","SP","MCA","64503MCA A601","","","0","COWL,L INNER","1513","2026/02/06","5","64503MCAA60"
+"K*SP**","PO","SP","MCA","64503MCA S400","","","0","COWL,L INNER","1513","2026/02/20","5","64503MCAS40"
+"K*SP**","PO","SP","V17","65141V17 0001","G193R","G193R","0","FENDER,R FRONT","1513","2026/02/09","10","65141V17000ZA"
+"K*SP**","PO","SP","MFP","77210MFP N901XB","","SOZAI","0","COWL COMP,REAR","1513","2026/02/05","15","77210MFPN90XB"
+"K*SP**","PO","SP","MGP","77211MGP D000AB","","SOZAI","0","SEAT COWL(SANDIG)","1513","2026/02/18","5","77211MGPD00AB"
+"K*SP**","PO","SP","MKV","77221MKV D000AA","","SOZAI","","COWL,R REAR(SOZAI)","1513","2026/02/05","15","77221MKVD00AA"
+"K*SP**","PO","SP","MKA2","77230MKA D700AA","","SOZAI","","COWL,L REAR(SOZAI)","1513","2026/02/09","5","77230MKAD70AA"
+"K*SP**","PO","SP","MFM","77231MFM C000AB","","SOZAI","MFM新型","COWL RR CENTER(SANDING)","1513","2026/02/13","5","77231MFMC00AB"
+"K*SP**","PO","SP","MKF","77231MKF D400AA","","SOZAI","0","COWL,REAR UNDER(SOZAI)","1513","2026/02/23","5","77231MKFD40AA"
+"K*SP**","PO","SP","MFM","77241MFM C000AB","","SOZAI","MFM新型","COWL R RR(SANDING)","1513","2026/02/09","10","77241MFMC00AB"
+"K*SP**","PO","SP","MKR","77241MKR D100AA","","SOZAI","","COWL,L REAR SIDE(SOZAI)","1513","2026/02/10","10","77241MKRD10AA"
+"K*SP**","PO","SP","MFM","77251MFM C000AB","","SOZAI","MFM新型","COWL L RR(SANDING)","1513","2026/02/06","20","77251MFMC00AB"
+"K*SP**","PO","SP","MKT","77261MKT D000AA","","SOZAI","D000AA","COWL,L REAR(SOZAI)","1513","2026/02/20","5","77261MKTD00AA"
+"K*SP**","PO","SP","MKV","77271MKV D000AA","","SOZAI","","COWL,L REAR(SOZAI)","1513","2026/02/23","5","77271MKVD00AA"
+"K*SP**","PO","SP","K88","80100K88 L201","PB186","PB186","0","FENDER,REAR","1513","2026/02/23","5","80100K88L20ZC"
+"K*SP**","PO","SP","K88","80100K88 L201","R110","R110","0","FENDER,REAR","1513","2026/02/10","5","80100K88L20ZB"
+"K*SP**","PO","SP","K88","80100K88 L201","T23","T23","0","FENDER,REAR","1513","2026/02/11","10","80100K88L20ZA"
+"K*SP**","PO","SP","MJR","80100MJR 6700AB","","SOZAI","0","FENDER B RR(SANDING)","1513","2026/02/10","5","80100MJR670AB"
+"K*SP**","PO","SP","MKE","80101K95 AJ00","R292R","R292R","0","SET ILLUS,RR FENDER","1513","2026/02/19","5","80101K95AJ0ZA"
+"K*SP**","PO","SP","MCA","80107MCA S400AB","","SOZAI","0","COVER R SADDLEBAG REAR(SANDING)","1513","2026/02/26","5","80107MCAS40AB"
+"K*SP**","PO","SP","HP1","80110HP1 60002001","NH196","NH196","0","REAR FENDER","1513","2026/02/23","10","80110HP1600ZD"
+"K*SP**","PO","SP","HP1","80110HP1 60002001","NHA79MR","NHA79MR","0","REAR FENDER","1513","2026/02/19","10","80110HP1600ZA"
+"K*SP**","PO","SP","HP1","80110HP1 60002001","NHA79MR","NHA79MR","0","REAR FENDER","1513","2026/02/20","5","80110HP1600ZA"
+"K*SP**","PO","SP","MKC","80131MKC A000AB","","SOZAI","","COVERA,LSADDLEBAGRR(SANDING)","1513","2026/02/17","10","80131MKCA00AB"
+"K*SP**","PO","SP","K88","80151K88 L201","T23","T23","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/12","5","80151K88L20ZA"
+"K*SP**","PO","SP","GJH","81100GJH J000","TYPE1","","0","SET ILLUS,RR DECK COVER","1513","2026/02/13","2","81100GJHJ00ZA"
+"K*SP**","PO","SP","MKC","81112MKC A000AB","","SOZAI","","COVER R,TRUNK SIDE(SANDING)","1513","2026/02/20","5","81112MKCA00AB"
+"K*SP**","PO","SP","MKC","81112MKC L000AB","","SOZAI","","COVER,R TRUNK SIDE(SANDING)","1513","2026/02/02","20","81112MKCL00AB"
+"K*SP**","PO","SP","MKC","81114MKC A001","","","旧型","BOX ASSY,TRUNK INNER","1513","2026/02/17","15","81114MKCA00"
+"K*SP**","PO","SP","MKC","81116MKC A000AB","","SOZAI","","COVER CENTER,TRUNKLWR(SANDING)","1513","2026/02/06","10","81116MKCA00AB"
+"K*SP**","PO","SP","MKC","81116MKC L000AB","","SOZAI","","COVER CENTER,TRUNKLWR(SANDING)","1513","2026/02/02","5","81116MKCL00AB"
+"K*SP**","PO","SP","MKC","81121MKC A000AB","","SOZAI","TL_OLD","LID,TRUNK(SANDING)","1513","2026/02/13","5","81121MKCA00AB"
+"K*SP**","PO","SP","K88","81131K88 L210","NH388R","NH388R","スタンダード・ビジネス","SHIELD,LEG(NEW)","1513","2026/02/18","50","81131K88L21ZA"
+"K*SP**","PO","SP","K88","81135K88 Y100","YR176","YR176","ビジネス","COVER,COMB AND LOCK","1513","2026/02/12","10","81135K88Y10ZB"
+"K*SP**","PO","SP","MCA","81143MCA S400AB","","SOZAI","0","COVER R LWR TRUNK(SANDING)","1513","2026/02/26","10","81143MCAS40AB"
+"K*SP**","PO","SP","MCA","81148MCA S400AB","","SOZAI","0","COVER L LWR TRUNK(SANDING)","1513","2026/02/25","25","81148MCAS40AB"
+"K*SP**","PO","SP","MKC","81212MKC A000AB","","SOZAI","","COVER,L TRUNK SIDE(SANDING)","1513","2026/02/13","5","81212MKCA00AB"
+"K*SP**","PO","SP","MKC","81212MKC L000AB","","SOZAI","","COVER,L TRUNK SIDE(SANDING)","1513","2026/02/03","20","81212MKCL00AB"
+"K*SP**","PO","SP","MCA","81221MCA S400AB","","SOZAI","0","LID,R SADDLEBAG(SANDING)","1513","2026/02/25","10","81221MCAS40AB"
+"K*SP**","PO","SP","MCA","81231MCA S400","","","0","PANEL,R SADDLEBAG","1513","2026/02/25","5","81231MCAS40"
+"K*SP**","PO","SP","MCA","81241MCA S400","","","0","INNER LID,R SADDLEBAG","1513","2026/02/26","5","81241MCAS40"
+"K*SP**","PO","SP","MKC","81311MKC A001","","","0","BODY,R SADDLEBAG","1513","2026/02/02","15","81311MKCA00"
+"K*SP**","PO","SP","MKC","81311MKC A101","","","AUDIO","BODY,R SADDLEBAG","1513","2026/02/06","5","81311MKCA10"
+"K*SP**","PO","SP","MKC","81321MKC A000AB","","SOZAI","","LID,R SADDLEBAG(SANDING)","1513","2026/02/06","20","81321MKCA00AB"
+"K*SP**","PO","SP","MKC","81331MKC A000","","","0","PANEL,R SADDLEBAG","1513","2026/02/09","15","81331MKCA00"
+"K*SP**","PO","SP","MKC","81331MKC A000","","","0","PANEL,R SADDLEBAG","1513","2026/02/10","5","81331MKCA00"
+"K*SP**","PO","SP","MKC","81341MKC A001","","","0","INNER LID,R SADDLEBAG","1513","2026/02/12","10","81341MKCA00"
+"K*SP**","PO","SP","MJN","81360MJN A002","","NH1","0","LID,L SADDLEBAG","1513","2026/02/11","10","81360MJNA00"
+"K*SP**","PO","SP","MKC","81411MKC A001","","","0","BODY,L SADDLEBAG","1513","2026/02/04","15","81411MKCA00"
+"K*SP**","PO","SP","MKC","81411MKC A001","","","0","BODY,L SADDLEBAG","1513","2026/02/05","15","81411MKCA00"
+"K*SP**","PO","SP","MKC","81411MKC A101","","","0","BODY,L SADDLEBAG","1513","2026/02/09","10","81411MKCA10"
+"K*SP**","PO","SP","MCA","81421MCA S400AB","","SOZAI","0","LID,L SADDLEBAG(SANDING)","1513","2026/02/26","10","81421MCAS40AB"
+"K*SP**","PO","SP","MKC","81421MKC A000AB","","SOZAI","0","LID,L SADDLEBAG(SANDING)","1513","2026/02/05","15","81421MKCA00AB"
+"K*SP**","PO","SP","MKC","81431MKC A001","","","0","PANEL,L SADDLEBAG","1513","2026/02/11","15","81431MKCA00"
+"K*SP**","PO","SP","MKC","81431MKC A001","","","0","PANEL,L SADDLEBAG","1513","2026/02/12","10","81431MKCA00"
+"K*SP**","PO","SP","MKC","81441MKC A001","","","0","INNER LID,L SADDLEBAG","1513","2026/02/10","15","81441MKCA00"
+"K*SP**","PO","SP","MCA","81501MCA S400AB","","SOZAI","0","COWL CTR RR SADDLEBAG(SANDING)","1513","2026/02/26","5","81501MCAS40AB"
+"K*SP**","PO","SP","MKC","81550MKC A100AB","","SOZAI","","COVER,CTR RR TOP(SANDING)","1513","2026/02/13","5","81550MKCA10AB"
+"K*SP**","PO","SP","MKC","81551MKC A100AA","","SOZAI","","LID R,RR TOP(SOZAI)","1513","2026/02/12","10","81551MKCA10AA"
+"K*SP**","PO","SP","MKC","81556MKC A100AA","","SOZAI","","LID L,RR TOP(SOZAI)","1513","2026/02/16","5","81556MKCA10AA"
+"K*SP**","PO","SP","MCA","82513MCA S400","","NH1","0","COVER,L SADDLEBAG LID","1513","2026/02/20","5","82513MCAS40"
+"K*SP**","PO","SP","MKR","83152MKR D100AB","","SOZAI","","SHELTER,FR(SANDING)","1513","2026/02/10","5","83152MKRD10AB"
+"K*SP**","PO","SP","MKR","83162MKR D100AA","","SOZAI","","COVER,R SIDE(SOZAI)","1513","2026/02/10","5","83162MKRD10AA"
+"K*SP**","PO","SP","MKR","83172MKR D100AA","","SOZAI","","COVER,L SIDE(SOZAI)","1513","2026/02/11","5","83172MKRD10AA"
+"K*SP**","PO","SP","K88","83404K88 L001","NH388R","NH388R","0","LID,R BODY COVER","1513","2026/02/18","5","83404K88L00ZA"
+"K*SP**","PO","SP","K88","83404K88 L201","NH1","NH1","0","LID,R BODY COVER","1513","2026/02/19","10","83404K88L20ZD"
+"K*SP**","PO","SP","K88","83410K88 B000","TYPE2","NH1","0","SET ILLUS,R BODY COVER LID","1513","2026/02/04","5","83410K88B00ZB"
+"K*SP**","PO","SP","K88","83410K88 B000","TYPE3","NH1","0","SET ILLUS,R BODY COVER LID","1513","2026/02/09","10","83410K88B00ZA"
+"K*SP**","PO","SP","K88","83504K88 L001","NH388R","NH388R","0","LID,L BODY COVER","1513","2026/02/12","25","83504K88L00ZA"
+"K*SP**","PO","SP","K88","83504K88 L201","NH1","NH1","0","LID,L BODY COVER","1513","2026/02/02","15","83504K88L20ZD"
+"K*SP**","PO","SP","K88","83504K88 L201","R110","R110","0","LID,L BODY COVER","1513","2026/02/16","20","83504K88L20ZB"
+"K*SP**","PO","SP","K88","83504K88 L201","R110","R110","0","LID,L BODY COVER","1513","2026/02/17","20","83504K88L20ZB"
+"K*SP**","PO","SP","K88","83510GGN B000 01","TYPE1","NH1","0","SET ILLUS,L BODY COVER LID","1513","2026/02/05","5","83510GGNB00ZA"
+"K*SP**","PO","SP","GGZ","83510GGZ J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/11","5","83510GGZJ00AA"
+"K*SP**","PO","SP","GJA","83510GJA J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/11","50","83510GJAJ00AA"
+"K*SP**","PO","SP","GJA","83510GJA J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/12","15","83510GJAJ00AA"
+"K*SP**","PO","SP","GJB","83510GJB J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/19","5","83510GJBJ00AA"
+"K*SP**","PO","SP","GJB","83510GJB J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/20","50","83510GJBJ00AA"
+"K*SP**","PO","SP","GJB","83510GJB J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/23","50","83510GJBJ00AA"
+"K*SP**","PO","SP","K88","83510K88 B000","TYPE3","NH1","0","SET ILLUS,L BODY COVER LID","1513","2026/02/10","5","83510K88B00ZA"
+"K*SP**","PO","SP","MLC","83510MLC D000AB","","SOZAI","","COVER,A R SIDE(SANDING)","1513","2026/02/06","5","83510MLCD00AB"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/10","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/11","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/12","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/13","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/16","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/17","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/18","40","83520GJBJ00AA"
+"K*SP**","PO","SP","GGZ","83521GGZ J001AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/11","5","83521GGZJ00AA"
+"K*SP**","PO","SP","MKW","83521MKW D000AB","","SOZAI","","SHELTER,R SIDE(SANDING)","1513","2026/02/04","5","83521MKWD00AB"
+"K*SP**","PO","SP","MFM","83600MFM C000AB","","SOZAI","0","COVER R SIDE(SANDING)","1513","2026/02/13","5","83600MFMC00AB"
+"K*SP**","PO","SP","K88","83601K88 L210","T23","T23","0","COVER,R BODY","1513","2026/02/16","10","83601K88L21ZA"
+"K*SP**","PO","SP","GJA","83610GJA J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/13","50","83610GJAJ00AA"
+"K*SP**","PO","SP","GJA","83610GJA J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/16","10","83610GJAJ00AA"
+"K*SP**","PO","SP","GJB","83610GJB J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/24","10","83610GJBJ00AA"
+"K*SP**","PO","SP","GJB","83610GJB J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/25","50","83610GJBJ00AA"
+"K*SP**","PO","SP","GJB","83610GJB J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/26","50","83610GJBJ00AA"
+"K*SP**","PO","SP","MJP","83611MJP G501AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/03","15","83611MJPG50AA"
+"K*SP**","PO","SP","MKC","83611MKC A000AB","","SOZAI","","COVER A,R SIDE(SANDING)","1513","2026/02/03","5","83611MKCA00AB"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/18","19","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/19","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/20","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/23","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/24","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/25","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/26","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GGZ","83621GGZ J001AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/11","5","83621GGZJ00AA"
+"K*SP**","PO","SP","MFT","83661MFT 6400AA","","SOZAI","0","COVER L RR BODY LOWER(SOZAI)","1513","2026/02/23","5","83661MFT640AA"
+"K*SP**","PO","SP","MJP","83711MJP G501AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/04","10","83711MJPG50AA"
+"K*SP**","PO","SP","MKC","83711MKC A000AB","","SOZAI","","COVER A,L SIDE(SANDING)","1513","2026/02/05","5","83711MKCA00AB"
+"K*SP**","PO","SP","MKS2","83711MKS E201AA","","SOZAI","","COWL L,RR SIDE(SOZAI)","1513","2026/02/18","5","83711MKSE20AA"
+"K*SP**","PO","SP","MLF","83711MLF E000AB","","SOZAI","","COWL A,L RR SIDE(SANDING)","1513","2026/02/24","5","83711MLFE00AB"
+"K*SP**","PO","SP","GJB","83712GJB J000AA","","SOZAI","0","COVER,RR CENTER(SOZAI)","1513","2026/02/24","10","83712GJBJ00AA"
+"K*SP**","PO","SP","MKN","17570MKY D600 03","NHA86M","NHA86M","0","COVER ASSY,FUEL TANK FR","1513","2026/02/03","5","17570MKYD60ZG"
+"K*SP**","PO","SP","K88","53206K88 J001","NH388","NH388","スタンダード","COVER,HANDLE LOW","1513","2026/02/20","5","53206K88J00ZD"
+"K*SP**","PO","SP","K88","53206K88 J001","PB394M","PB394M","スタンダード","COVER,HANDLE LOW","1513","2026/02/06","5","53206K88J00ZC"
+"K*SP**","PO","SP","K88","53206K88 J001","YR176","YR176","スタンダード","COVER,HANDLE LOW","1513","2026/02/25","5","53206K88J00ZH"
+"K*SP**","PO","SP","K64","61000K64 JH00 03","TYPE3","R380","23YM","SET ILLUS,FR FENDER","1513","2026/02/25","5","61000K64JH0ZA"
+"K*SP**","PO","SP","K88","61100K88 J001","B197M","B197M","スタンダード","FENDER,FRONT","1513","2026/02/03","15","61100K88J00ZG"
+"K*SP**","PO","SP","K88","61100K88 J001","G142M","G142M","スタンダード","FENDER,FRONT","1513","2026/02/02","15","61100K88J00ZF"
+"K*SP**","PO","SP","K88","61100K88 J001","NH388","NH388","スタンダード","FENDER,FRONT","1513","2026/02/20","10","61100K88J00ZD"
+"K*SP**","PO","SP","K88","61100K88 J001","PB394M","PB394M","スタンダード","FENDER,FRONT","1513","2026/02/06","15","61100K88J00ZC"
+"K*SP**","PO","SP","K88","61100K88 J001","R201","R201","スタンダード","FENDER,FRONT","1513","2026/02/13","5","61100K88J00ZJ"
+"K*SP**","PO","SP","K88","61100K88 J001","YR211","YR211","スタンダード","FENDER,FRONT","1513","2026/02/18","5","61100K88J00ZB"
+"K*SP**","PO","SP","MFJ","61100MFJ D001 06","NHA86M","NHA86M","0","FENDER,FR COMP","1513","2026/02/02","10","61100MFJD00ZV"
+"K*SP**","PO","SP","MKN","61101MKN D500 06","NHD19M","NHD19M","0","FENDER,COMP FRONT","1513","2026/02/13","20","61101MKND50ZW"
+"K*SP**","PO","SP","MKN","61110MKY J500 03","TYPE1","R381C","0","SET ILLUS,FR FENDER","1513","2026/02/25","5","61110MKYJ50ZC"
+"K*SP**","PO","SP","MLRX","61110MLR J800 03","TYPE1","NHA86M","DQ00AA","FENDER,COMP FRONT","1513","2026/02/25","10","61110MLRJ80ZA"
+"K*SP**","PO","SP","MJC","64100MJC LS00","NHC47P","NHC47P","0","SET ILLUS,UPPER COWL","1513","2026/02/05","5","64100MJCLS0ZA"
+"K*SP**","PO","SP","MKZ","64100MKZ J300","TYPE1","R380","0","SET ILLUST,UPPER COWL","1513","2026/02/10","15","64100MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64100MKZ J300","TYPE1","R380","0","SET ILLUST,UPPER COWL","1513","2026/02/11","15","64100MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64100MKZ J400","TYPE1","NHA86M","0","SET ILLUST,UPPER COWL","1513","2026/02/19","20","64100MKZJ40ZA"
+"K*SP**","PO","SP","MKC","64100MLJ M200","TYPE1","R337M","8A+7B","SET ILLUS,GARNISH SCREEN A","1513","2026/02/17","5","64100MLJM20ZA"
+"K*SP**","PO","SP","MKC","64100MLJ M700","TYPE1","YR387M/NHC07M","8A+7A+7B","SET ILLUS,GARNISH SCREEN A","1513","2026/02/25","5","64100MLJM70ZA"
+"K*SP**","PO","SP","MKC","64105MKC A000 02","TYPE1","NHB73M","8A","GARNISH B ASSY,SCREEN","1513","2026/02/02","15","64105MKCA00ZB"
+"K*SP**","PO","SP","MKC","64105MKC A100 02","TYPE1","NHB01","7B+8A","GARNISH B ASSY,SCREEN","1513","2026/02/05","10","64105MKCA10ZA"
+"K*SP**","PO","SP","MKC","64110MKC A000","NHA86M","NHA86M","OCなし","GARNISH A,SCREEN","1513","2026/02/02","5","64110MKCA00ZH"
+"K*SP**","PO","SP","MKV","64111MKV D500 01","YR386M","YR386M","D500AA","COWL,FRONT","1513","2026/02/18","10","64111MKVD50ZA"
+"K*SP**","PO","SP","MKT","64140MKT D000 03","NHA86M","NHA86M","D000AA","COVER ASSY,INNER","1513","2026/02/09","5","64140MKTD00ZG"
+"K*SP**","PO","SP","MKT","64140MKT D000 03","NHB01","NHB01","D000AA","COVER ASSY,INNER","1513","2026/02/09","35","64140MKTD00ZD"
+"K*SP**","PO","SP","MKT","64140MKT D000 03","R380","R380","D000AA","COVER ASSY,INNER","1513","2026/02/23","10","64140MKTD00ZA"
+"K*SP**","PO","SP","MKW","64151MKW D000","NHC08M","NHC08M","0","PANEL,R AIR","1513","2026/02/24","25","64151MKWD00ZA"
+"K*SP**","PO","SP","MKW","64151MKW D700","NHB01","NHB01","D700AA","PANEL,R AIR","1513","2026/02/13","10","64151MKWD70ZB"
+"K*SP**","PO","SP","MKW","64161MKW D000","NHC08M","NHC08M","0","PANEL,L AIR","1513","2026/02/25","10","64161MKWD00ZA"
+"K*SP**","PO","SP","MKW","64161MKW D700","NHB01","NHB01","D700AA","PANEL,L AIR","1513","2026/02/12","10","64161MKWD70ZB"
+"K*SP**","PO","SP","MKW","64161MKW D700","NHC08M","NHC08M","D700AA","PANEL,L AIR","1513","2026/02/23","15","64161MKWD70ZA"
+"K*SP**","PO","SP","MKYJ","64210MKY JF00","R380","R380","MKY E000AA","SET ILLUS,R MID COWL A","1513","2026/02/23","1","64210MKYJF0ZA"
+"K*SP**","PO","SP","MLN1","64210MLN E000","NHA86M","NHA86M","1型","COWL,FR CENTER","1513","2026/02/23","20","64210MLNE00ZC"
+"K*SP**","PO","SP","MLT","64211MLT D000","NHB01","NHB01","","COWL,FR UPPER","1513","2026/02/18","5","64211MLTD00ZC"
+"K*SP**","PO","SP","MLT","64211MLT D000","R380","R380","","COWL,FR UPPER","1513","2026/02/17","5","64211MLTD00ZA"
+"K*SP**","PO","SP","MLL","64212MLL D001","NHA86M","NHA86M","","COWL,R UPPER H/L","1513","2026/02/02","10","64212MLLD00ZE"
+"K*SP**","PO","SP","MLL","64212MLL D001","R380","R380","","COWL,R UPPER H/L","1513","2026/02/16","10","64212MLLD00ZA"
+"K*SP**","PO","SP","MFP","64220MFP JV00 01","TYPE1 1","NHA66P/R381C","8A+7A+8B+7B","SET ILLUS,R SIDE COWL","1513","2026/02/03","5","64220MFPJV0ZB"
+"K*SP**","PO","SP","MFP","64220MFP SB00 01","TYPE1 1","PB409P/NHB53P","ミラー2TN035 8A+7A+7B","SET ILLUS,R SIDE COWL","1513","2026/02/10","5","64220MFPSB0ZB"
+"K*SP**","PO","SP","MLRX","64220MLR J900","NHB53P","NHB53P","D800AA","COWL ASSY,R MIDDLE","1513","2026/02/13","4","64220MLRJ90ZA"
+"K*SP**","PO","SP","MKT","64222MKT D700","NHD05","NHD05","D700AA","COWL,NOSE","1513","2026/02/25","10","64222MKTD70ZC"
+"K*SP**","PO","SP","MKT","64222MKT D700","PB409P","PB409P","D700AA","COWL,NOSE","1513","2026/02/10","5","64222MKTD70ZD"
+"K*SP**","PO","SP","MFP","64230MFP SB00 01","TYPE1 1","PB409P/NHB53P","ミラー2TN035 8A+7A+7B","SET ILLUS,L SIDE COWL","1513","2026/02/11","5","64230MFPSB0ZB"
+"K*SP**","PO","SP","MLRX","64240MLR J900","NHB53P","NHB53P","D800AA","COWL ASSY,L MIDDLE","1513","2026/02/16","30","64240MLRJ90ZA"
+"K*SP**","PO","SP","MLRX","64240MLR Y800","R134","R134","D800AA","COWL ASSY,L MIDDLE","1513","2026/02/23","5","64240MLRY80ZA"
+"K*SP**","PO","SP","MLF","64241MLF E800","YR386M","YR386M","一発クリア","COWL,FR CENTER","1513","2026/02/17","5","64241MLFE80ZA"
+"K*SP**","PO","SP","MLRR","64251MLR D000","NHA86M","NHA86M","D000AA","COWL,R MIDDLE","1513","2026/02/25","5","64251MLRD00ZC"
+"K*SP**","PO","SP","MKS2","64252MKS E200 04","TYPE1","NHA86M","2型 8A","COVER ASSY,FRONT LOWER","1513","2026/02/06","10","64252MKSE20ZB"
+"K*SP**","PO","SP","MKS2","64252MKS E200 04","TYPE2","NHB53P","2型 7B+8A","COVER ASSY,FRONT LOWER","1513","2026/02/20","15","64252MKSE20ZA"
+"K*SP**","PO","SP","MKS1","64255MKS E000","TYPE1","NHA86M","1型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/05","10","64255MKSE00ZA"
+"K*SP**","PO","SP","MKS2","64255MKS E200 01","TYPE2","B197M","2型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/03","15","64255MKSE20ZA"
+"K*SP**","PO","SP","MKS1","64255MLG E500","TYPE1","B197M","1型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/04","5","64255MLGE50ZA"
+"K*SP**","PO","SP","MLN1","64255MLN E200","TYPE1","NHB01","1型 8A+7B","SET ILLUS,FR CENTER COWL","1513","2026/02/18","15","64255MLNE20ZC"
+"K*SP**","PO","SP","MLN4","64255MLN ER00","NHB01","NHB01","MKS2型 8A","SET ILLUS,FR CENTER COWL","1513","2026/02/16","10","64255MLNER0ZA"
+"K*SP**","PO","SP","MLN4","64255MLN ES00 01","TYPE1","NHB53P","MKS2型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/19","10","64255MLNES0ZA"
+"K*SP**","PO","SP","MKS1","64260MKS E000 01","TYPE1","NHA86M","1型 7B","SET ILLUS,R FR SIDE COWL","1513","2026/02/05","10","64260MKSE00ZB"
+"K*SP**","PO","SP","MKS1","64260MKS E000 01","TYPE2","R380","1型 7B","SET ILLUS,R FR SIDE COWL","1513","2026/02/23","10","64260MKSE00ZA"
+"K*SP**","PO","SP","MKS1","64265MKS E000 01","TYPE1","NHA86M","1型 7B","SET ILLUS,L FR SIDE COWL","1513","2026/02/06","5","64265MKSE00ZB"
+"K*SP**","PO","SP","MKS1","64265MKS E000 01","TYPE2","R380","1型 7B","SET ILLUS,L FR SIDE COWL","1513","2026/02/24","20","64265MKSE00ZA"
+"K*SP**","PO","SP","MKS1","64265MLG E400","NHB53P","NHB53P","1型 8A+7B","SET ILLUS,L FR SIDE COWL","1513","2026/02/16","10","64265MLGE40ZD"
+"K*SP**","PO","SP","MLRR","64280MLR J200","R380","R380","D000AA","SET ILLUS,R WINGLET COWL","1513","2026/02/16","5","64280MLRJ20ZA"
+"K*SP**","PO","SP","K64","64300K64 JH01","TYPE2","NHB53P","23YM","SET ILLUS,R MIDDLE COWL","1513","2026/02/26","10","64300K64JH0ZA"
+"K*SP**","PO","SP","MJC","64300MJC LS00 01","NHC47P","NHC47P","0","SET ILLUS,R MIDDLE COWL","1513","2026/02/05","10","64300MJCLS0ZA"
+"K*SP**","PO","SP","MKT","64300MKT D700","NHB53P","NHB53P","D700AA","COWL ASSY,R RR SIDE","1513","2026/02/17","5","64300MKTD70ZA"
+"K*SP**","PO","SP","MKT","64300MKT D700","NHD05","NHD05","D700AA","COWL ASSY,R RR SIDE","1513","2026/02/25","5","64300MKTD70ZC"
+"K*SP**","PO","SP","MLB","64300MLB D200","TYPE1","NHB54P","0","SET ILLUS,R SHROUD A","1513","2026/02/02","5","64300MLBD20ZD"
+"K*SP**","PO","SP","MLB","64300MLB D200","TYPE2","B197M","0","SET ILLUS,R SHROUD A","1513","2026/02/04","5","64300MLBD20ZC"
+"K*SP**","PO","SP","MLB","64300MLB D200","TYPE4","NHA86M","0","SET ILLUS,R SHROUD A","1513","2026/02/25","15","64300MLBD20ZA"
+"K*SP**","PO","SP","MLB","64300MLB G400","TYPE1","NHB54P","0","SET ILLUS,R SHROUD A","1513","2026/02/04","5","64300MLBG40ZC"
+"K*SP**","PO","SP","MKC","64300MLJ M500 01","NHA86M","NHA86M","8A+8B","COWL ASSY,R MIDDLE","1513","2026/02/03","5","64300MLJM50ZA"
+"K*SP**","PO","SP","MLRR","64300MLR J200","R380","R380","D000AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/16","5","64300MLRJ20ZA"
+"K*SP**","PO","SP","MKC","64305MLJ AY00","TYPE1","NH389M","8A+8B","COWL ASSY,L MIDDLE","1513","2026/02/27","5","64305MLJAY0ZA"
+"K*SP**","PO","SP","MKA2","64310MJL D701","NH436M","NH436M","新型","COWL,R FRONT SIDE","1513","2026/02/26","5","64310MJLD70ZF"
+"K*SP**","PO","SP","MKT","64310MKT D600","TYPE2","R380","D000AA 旧型","SET ILLUS,R SIDE COWL","1513","2026/02/23","5","64310MKTD60ZA"
+"K*SP**","PO","SP","MKT","64310MKT D800","Y242","Y242","D700AA","SET ILLUS,R SIDE COWL","1513","2026/02/06","10","64310MKTD80ZA"
+"K*SP**","PO","SP","MLF","64310MLF E800","NHC52MC","NHC52MC","8A E800AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/16","5","64310MLFE80ZC"
+"K*SP**","PO","SP","MLF","64310MLF E800","PB409PC","PB409PC","8A E800AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/27","5","64310MLFE80ZB"
+"K*SP**","PO","SP","MKS1","64310MLG E500","TYPE1","NHB53P","1型 8A+7B","SET ILLUS,R MIDDLE COWL","1513","2026/02/13","5","64310MLGE50ZA"
+"K*SP**","PO","SP","MLL","64310MLL D000","NHB01","NHB01","8A","SET ILLUS,R SHROUD A","1513","2026/02/16","5","64310MLLD00ZA"
+"K*SP**","PO","SP","MLL","64310MLL W100","NHB01","NHB01","8A","SET ILLUS,R SHROUD A","1513","2026/02/18","13","64310MLLW10ZA"
+"K*SP**","PO","SP","MLN1","64310MLN E100","NHA86M","NHA86M","1型 8A","SET ILLUS,R MIDDLE COWL","1513","2026/02/23","5","64310MLNE10ZA"
+"K*SP**","PO","SP","MLN1","64310MLN E200","R380","R380","1型 8A+7B","SET ILLUS,R MIDDLE COWL","1513","2026/02/16","10","64310MLNE20ZA"
+"K*SP**","PO","SP","MLN1","64310MLN E500 01","NHB53P","NHB53P","1型 8A+7B","SET ILLUS,R MIDDLE COWL","1513","2026/02/20","15","64310MLNE50ZA"
+"K*SP**","PO","SP","MKT","64311MKT D000","NHA86M","NHA86M","D000AA 旧型","COWL,R SIDE","1513","2026/02/09","15","64311MKTD00ZG"
+"K*SP**","PO","SP","MKT","64311MKT D000","NHC64M","NHC64M","D000AA 旧型","COWL,R SIDE","1513","2026/02/04","5","64311MKTD00ZF"
+"K*SP**","PO","SP","MKT","64311MKT D700","NHB01","NHB01","D700AA","COWL,R SIDE","1513","2026/02/09","20","64311MKTD70ZB"
+"K*SP**","PO","SP","MKT","64311MKT D700","NHB53P","NHB53P","D700AA","COWL,R SIDE","1513","2026/02/17","10","64311MKTD70ZA"
+"K*SP**","PO","SP","MKV","64311MKV D500 01","NHC65M","NHC65M","D500AA","COWL,R FRONT SIDE A","1513","2026/02/12","5","64311MKVD50ZB"
+"K*SP**","PO","SP","MKT","64315MKT D700","NHB53P","NHB53P","D700AA","LID COMP,POCKET","1513","2026/02/18","5","64315MKTD70ZA"
+"K*SP**","PO","SP","MKT","64315MKT DB00","NHB54P","NHB54P","D700AA ストライプ有り","LID COMP,POCKET","1513","2026/02/05","10","64315MKTDB0ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J300 02","R380","R380","0","COWL ASSY,R MIDDLE","1513","2026/02/10","15","64315MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J300 02","R380","R380","0","COWL ASSY,R MIDDLE","1513","2026/02/11","10","64315MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J400 02","NHA86M","NHA86M","0","COWL ASSY,R MIDDLE","1513","2026/02/20","15","64315MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J400 02","NHA86M","NHA86M","0","COWL ASSY,R MIDDLE","1513","2026/02/23","15","64315MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64320MKZ J300","PB440M","PB440M","0","SET ILLUS,R WINGLET","1513","2026/02/18","30","64320MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64320MKZ J400","NHA86M","NHA86M","0","SET ILLUS,R WINGLET","1513","2026/02/20","15","64320MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64320MKZ J400","NHA86M","NHA86M","0","SET ILLUS,R WINGLET","1513","2026/02/23","20","64320MKZJ40ZA"
+"K*SP**","PO","SP","MLRX","64320MLR Y800","TYPE1","NHA86M","D800AA","SET ILLUS,R FR SIDE COWL","1513","2026/02/25","10","64320MLRY80ZA"
+"K*SP**","PO","SP","MLM","64321MLM E000","NH389M","NH389M","0","COVER,R UNDER","1513","2026/02/24","15","64321MLME00ZA"
+"K*SP**","PO","SP","MLM","64321MLM E000","NH389M","NH389M","0","COVER,R UNDER","1513","2026/02/25","20","64321MLME00ZA"
+"K*SP**","PO","SP","MLM","64321MLM E000","NHD28M","NHD28M","0","COVER,R UNDER","1513","2026/02/02","15","64321MLME00ZB"
+"K*SP**","PO","SP","MLM","64321MLM E000","NHD28M","NHD28M","0","COVER,R UNDER","1513","2026/02/03","20","64321MLME00ZB"
+"K*SP**","PO","SP","MKW","64330MKW D000","TYPE3","R380","0","SET ILLUS,R MIDDLE COWL A","1513","2026/02/23","10","64330MKWD00ZB"
+"K*SP**","PO","SP","MKW","64330MKW D700","TYPE3","NHD05","D700AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/25","5","64330MKWD70ZA"
+"K*SP**","PO","SP","MLM","64331MLM E000","NH389M","NH389M","0","COVER,L UNDER","1513","2026/02/26","20","64331MLME00ZA"
+"K*SP**","PO","SP","MLM","64331MLM E000","NH389M","NH389M","0","COVER,L UNDER","1513","2026/02/27","20","64331MLME00ZA"
+"K*SP**","PO","SP","MLM","64331MLM E000","NHD28M","NHD28M","0","COVER,L UNDER","1513","2026/02/04","20","64331MLME00ZB"
+"K*SP**","PO","SP","MLM","64331MLM E000","NHD28M","NHD28M","0","COVER,L UNDER","1513","2026/02/05","20","64331MLME00ZB"
+"K*SP**","PO","SP","MLT","64335MLT D000","TYPE2","NHC47P","8A+8B","COVER ASSY,R FUEL TANK","1513","2026/02/09","5","64335MLTD00ZA"
+"K*SP**","PO","SP","MLT","64335MLT D100","R380","R380","8A+7B+8B","COVER ASSY,R FUEL TANK","1513","2026/02/16","10","64335MLTD10ZB"
+"K*SP**","PO","SP","K64","64340K64 J002","NH436M","NH436M","旧型","COVER,R FRONT SIDE","1513","2026/02/26","10","64340K64J00ZA"
+"K*SP**","PO","SP","MKW","64340MKW D000","TYPE1","NHA86M","0","SET ILLUS,L MIDDLE COWL A","1513","2026/02/17","10","64340MKWD00ZD"
+"K*SP**","PO","SP","MKW","64340MKW D000","TYPE3","R380","0","SET ILLUS,L MIDDLE COWL A","1513","2026/02/24","10","64340MKWD00ZB"
+"K*SP**","PO","SP","MKW","64340MKW D000","TYPE4","B197M","0","SET ILLUS,L MIDDLE COWL A","1513","2026/02/03","10","64340MKWD00ZA"
+"K*SP**","PO","SP","MKW","64340MKW D700","TYPE1","R134","D700AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/23","5","64340MKWD70ZC"
+"K*SP**","PO","SP","MKW","64340MKW D700","TYPE2","NHB54P","D700AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/03","15","64340MKWD70ZB"
+"K*SP**","PO","SP","MLRX","64340MLR Y800","TYPE1","NHA86M","D800AA","SET ILLUS,L FR SIDE COWL","1513","2026/02/26","15","64340MLRY80ZA"
+"K*SP**","PO","SP","MJC","64350MJC LS00 01","NHC47P","NHC47P","8A","SET ILLUS,L MIDDLE COWL","1513","2026/02/06","5","64350MJCLS0ZA"
+"K*SP**","PO","SP","MKT","64350MKT D700","NHB01","NHB01","D700AA","COWL ASSY,L RR SIDE","1513","2026/02/10","10","64350MKTD70ZB"
+"K*SP**","PO","SP","MKT","64350MKT D700","NHB53P","NHB53P","D700AA","COWL ASSY,L RR SIDE","1513","2026/02/18","5","64350MKTD70ZA"
+"K*SP**","PO","SP","MKT","64350MKT D700","NHD05","NHD05","D700AA","COWL ASSY,L RR SIDE","1513","2026/02/26","5","64350MKTD70ZC"
+"K*SP**","PO","SP","MKW","64351MKW D000","NHB01","NHB01","0","COWL B,R MIDDLE","1513","2026/02/13","5","64351MKWD00ZC"
+"K*SP**","PO","SP","MKW","64351MKW D000","NHC08M","NHC08M","0","COWL B,R MIDDLE","1513","2026/02/26","15","64351MKWD00ZA"
+"K*SP**","PO","SP","MKT","64360MKT D800","Y242","Y242","D700AA","SET ILLUS,L SIDE COWL","1513","2026/02/09","15","64360MKTD80ZA"
+"K*SP**","PO","SP","MLN1","64360MLN E100","NHA86M","NHA86M","1型 8A","SET ILLUS,L MIDDLE COWL","1513","2026/02/24","5","64360MLNE10ZA"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHA86M","NHA86M","D000AA 旧型","COWL,L SIDE","1513","2026/02/10","10","64361MKTD00ZG"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHB01","NHB01","D000AA 旧型","COWL,L SIDE","1513","2026/02/04","5","64361MKTD00ZD"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHC08M","NHC08M","D000AA 旧型","COWL,L SIDE","1513","2026/02/23","10","64361MKTD00ZC"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHC47P","NHC47P","D000AA 旧型","COWL,L SIDE","1513","2026/02/06","5","64361MKTD00ZB"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHC64M","NHC64M","D000AA 旧型","COWL,L SIDE","1513","2026/02/05","10","64361MKTD00ZF"
+"K*SP**","PO","SP","MKT","64361MKT D000","R380","R380","D000AA 旧型","COWL,L SIDE","1513","2026/02/24","5","64361MKTD00ZA"
+"K*SP**","PO","SP","MKT","64361MKT D700","NHB01","NHB01","D700AA","COWL,L SIDE","1513","2026/02/10","10","64361MKTD70ZB"
+"K*SP**","PO","SP","MKT","64361MKT D700","NHB53P","NHB53P","D700AA","COWL,L SIDE","1513","2026/02/18","5","64361MKTD70ZA"
+"K*SP**","PO","SP","MKV","64361MKV D500 01","NHA86M","NHA86M","D500AA","COWL,L FRONT SIDE A","1513","2026/02/18","15","64361MKVD50ZC"
+"K*SP**","PO","SP","MKV","64361MKV D500 01","YR386M","YR386M","D500AA","COWL,L FRONT SIDE A","1513","2026/02/18","5","64361MKVD50ZA"
+"K*SP**","PO","SP","MKW","64361MKW D000","NHB01","NHB01","0","COWL B,L MIDDLE","1513","2026/02/12","10","64361MKWD00ZC"
+"K*SP**","PO","SP","MKW","64361MKW D000","NHC08M","NHC08M","0","COWL B,L MIDDLE","1513","2026/02/27","15","64361MKWD00ZA"
+"K*SP**","PO","SP","MKZ","64365MKZ J300 01","R380","R380","0","COWL ASSY,L MIDDLE","1513","2026/02/12","20","64365MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64365MKZ J300 01","R380","R380","0","COWL ASSY,L MIDDLE","1513","2026/02/13","20","64365MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64365MKZ J400 01","NHA86M","NHA86M","0","COWL ASSY,L MIDDLE","1513","2026/02/24","10","64365MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64370MKZ J400","NHA86M","NHA86M","0","SET ILLUS,L WINGLET","1513","2026/02/24","25","64370MKZJ40ZA"
+"K*SP**","PO","SP","MKPX","64400MKP KQ00","TYPE2","NHB53P","J800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/16","5","64400MKPKQ0ZA"
+"K*SP**","PO","SP","MKZ","64400MKZ J300","TYPE1","R380","0","SET ILLUS,R UNDER COWL","1513","2026/02/10","15","64400MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64400MKZ J300","TYPE1","R380","0","SET ILLUS,R UNDER COWL","1513","2026/02/11","15","64400MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64400MKZ J300","TYPE2","NHA86M","0","SET ILLUS,R UNDER COWL","1513","2026/02/23","10","64400MKZJ30ZB"
+"K*SP**","PO","SP","MLB","64400MLB D200","TYPE1","NHB54P","0","SET ILLUS,L SHROUD A","1513","2026/02/03","15","64400MLBD20ZD"
+"K*SP**","PO","SP","MLB","64400MLB D200","TYPE4","NHA86M","0","SET ILLUS,L SHROUD A","1513","2026/02/26","10","64400MLBD20ZA"
+"K*SP**","PO","SP","MLB","64400MLB G400","TYPE1","NHB54P","0","SET ILLUS,L SHROUD A","1513","2026/02/05","5","64400MLBG40ZC"
+"K*SP**","PO","SP","MLRR","64400MLR J200","R380","R380","D000AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/17","10","64400MLRJ20ZA"
+"K*SP**","PO","SP","MLF","64410MLF E800","NHC52MC","NHC52MC","8A E800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/17","5","64410MLFE80ZC"
+"K*SP**","PO","SP","MLF","64410MLF E800","PB409PC","PB409PC","8A E800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/26","10","64410MLFE80ZB"
+"K*SP**","PO","SP","MLF","64410MLF E800","YR386M","YR386M","8A E800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/18","10","64410MLFE80ZA"
+"K*SP**","PO","SP","MLL","64410MLL D000","NHB01","NHB01","8A","SET ILLUS,L SHROUD A","1513","2026/02/17","15","64410MLLD00ZA"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHA86M","NHA86M","0","SKIRT,R FLOOR","1513","2026/02/11","15","64411MKVD00ZE"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHA86M","NHA86M","0","SKIRT,R FLOOR","1513","2026/02/12","15","64411MKVD00ZE"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHA86M","NHA86M","0","SKIRT,R FLOOR","1513","2026/02/13","10","64411MKVD00ZE"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHC08M","NHC08M","0","SKIRT,R FLOOR","1513","2026/02/20","20","64411MKVD00ZC"
+"K*SP**","PO","SP","MKV","64411MKV D000","PB417M","PB417M","0","SKIRT,R FLOOR","1513","2026/02/26","20","64411MKVD00ZB"
+"K*SP**","PO","SP","MKV","64411MKV D000","R381C","R381C","0","SKIRT,R FLOOR","1513","2026/02/25","5","64411MKVD00ZA"
+"K*SP**","PO","SP","MKR","64420MKR DH00 01","TYPE2","R380","8A+7B+8B","COWL ASSY,R UNDER","1513","2026/02/25","5","64420MKRDH0ZA"
+"K*SP**","PO","SP","MKT","64421MKT D000","NHC08M","NHC08M","D000AA 旧型","COVER,R SKIRT","1513","2026/02/20","5","64421MKTD00ZA"
+"K*SP**","PO","SP","MLT","64435MLT D100 01","R380","R380","8A+7B+8B","COVER ASSY,L FUEL TANK","1513","2026/02/17","10","64435MLTD10ZB"
+"K*SP**","PO","SP","K64","64440K64 J002","NH436M","NH436M","旧型","COVER,L FRONT SIDE","1513","2026/02/27","10","64440K64J00ZA"
+"K*SP**","PO","SP","K64","64440K64 J002","R380","R380","旧型","COVER,L FRONT SIDE","1513","2026/02/26","10","64440K64J00ZB"
+"K*SP**","PO","SP","MKPX","64440MKP KQ00","NHB01","NHB01","J800AA","SET ILLUS,L SIDE COWL A","1513","2026/02/27","10","64440MKPKQ0ZA"
+"K*SP**","PO","SP","MJC","64450MJC LS00 01","NHC47P","NHC47P","8A","COWL COMP,L UNDER","1513","2026/02/06","5","64450MJCLS0ZA"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHA86M","NHA86M","0","SKIRT,L FLOOR","1513","2026/02/16","15","64461MKVD00ZE"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHA86M","NHA86M","0","SKIRT,L FLOOR","1513","2026/02/17","15","64461MKVD00ZE"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHA86M","NHA86M","0","SKIRT,L FLOOR","1513","2026/02/18","10","64461MKVD00ZE"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHB01","NHB01","0","SKIRT,L FLOOR","1513","2026/02/11","10","64461MKVD00ZD"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHB01","NHB01","0","SKIRT,L FLOOR","1513","2026/02/12","10","64461MKVD00ZD"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHC08M","NHC08M","0","SKIRT,L FLOOR","1513","2026/02/23","5","64461MKVD00ZC"
+"K*SP**","PO","SP","MKV","64461MKV D000","PB417M","PB417M","0","SKIRT,L FLOOR","1513","2026/02/27","5","64461MKVD00ZB"
+"K*SP**","PO","SP","MKT","64471MKT D000","NHC64M","NHC64M","D000AA 旧型","COVER,L SKIRT","1513","2026/02/03","5","64471MKTD00ZC"
+"K*SP**","PO","SP","K64","64600K64 JK01","TYPE1","素材","86838K64 JK00 T-1黒マット","SET ILLUS,L MID INNER COWL","1513","2026/02/27","5","64600K64JK0ZA"
+"K*SP**","PO","SP","MKV","64600MKV D000","NHA86M","NHA86M","0","PANEL ASSY,R SIDE","1513","2026/02/12","5","64600MKVD00ZG"
+"K*SP**","PO","SP","MKV","64600MKV D000","PB417M","PB417M","0","PANEL ASSY,R SIDE","1513","2026/02/26","15","64600MKVD00ZB"
+"K*SP**","PO","SP","MKV","64600MKV D000","YR386M","YR386M","","PANEL ASSY,R SIDE","1513","2026/02/17","5","64600MKVD00ZH"
+"K*SP**","PO","SP","MKV","64620MKV D010 01","NHA86M","NHA86M","","COVER ASSY,R PIVOT","1513","2026/02/12","10","64620MKVD01ZD"
+"K*SP**","PO","SP","MKV","64650MKV D000","NHB01","NHB01","0","PANEL ASSY,L SIDE","1513","2026/02/11","5","64650MKVD00ZD"
+"K*SP**","PO","SP","MKV","64650MKV D000","PB417M","PB417M","0","PANEL ASSY,L SIDE","1513","2026/02/27","5","64650MKVD00ZB"
+"K*SP**","PO","SP","MKV","64670MKV D010","NHC08M","NHC08M","0","COVER ASSY,L PIVOT","1513","2026/02/23","5","64670MKVD01ZB"
+"K*SP**","PO","SP","MKZ","77210MKZ J300 01","TYPE1","R380","0","SET ILLUS,SEAT RR COWL","1513","2026/02/10","20","77210MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","77210MKZ J300 01","TYPE1","R380","0","SET ILLUS,SEAT RR COWL","1513","2026/02/11","20","77210MKZJ30ZA"
+"K*SP**","PO","SP","MKT","77211MKT D010","NHA86M","NHA86M","D000AA","COWL,R REAR","1513","2026/02/09","15","77211MKTD01ZG"
+"K*SP**","PO","SP","MKT","77211MKT D010","NHC47P","NHC47P","D000AA","COWL,R REAR","1513","2026/02/09","5","77211MKTD01ZB"
+"K*SP**","PO","SP","MKT","77211MKT D010","NHC64M","NHC64M","D000AA","COWL,R REAR","1513","2026/02/04","15","77211MKTD01ZF"
+"K*SP**","PO","SP","MFP","77220MFP JU00 03","TYPE1 2","NHA66P/R381C","8A+7A+8B+7B+8C","COWL ASSY,REAR","1513","2026/02/03","5","77220MFPJU0ZD"
+"K*SP**","PO","SP","MFP","77220MFP JU00 03","TYPE2 2","NHB01/NHC52M","8A+7A+8B+7B+8C","COWL ASSY,REAR","1513","2026/02/04","5","77220MFPJU0ZC"
+"K*SP**","PO","SP","MKR","77220MKR D100 02","TYPE2","R380","7B","SET ILLUS,SEAT CENTER COWL","1513","2026/02/23","10","77220MKRD10ZA"
+"K*SP**","PO","SP","MKV","77220MKV D500 01","TYPE2","NHA86M","D500AA","SET ILLUS,R REAR COWL","1513","2026/02/12","5","77220MKVD50ZB"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE1","NHA86M","","SET ILLUS,R REAR COWL A","1513","2026/02/25","5","77240MLBD80ZD"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE2","NHA86M","","SET ILLUS,R REAR COWL A","1513","2026/02/23","5","77240MLBD80ZC"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE3","NHC65M","","SET ILLUS,R REAR COWL A","1513","2026/02/12","5","77240MLBD80ZB"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE4 1","NHD19M","","SET ILLUS,R REAR COWL A","1513","2026/02/13","5","77240MLBD80ZE"
+"K*SP**","PO","SP","MLB","77240MLB G400","TYPE1","NHB54P","","SET ILLUS,R REAR COWL A","1513","2026/02/04","10","77240MLBG40ZC"
+"K*SP**","PO","SP","MLV","77240MLV J100 01","NHB01","NHB01","8A+7B","SET ILLUS,R REAR COWL","1513","2026/02/16","5","77240MLVJ10ZA"
+"K*SP**","PO","SP","MLL","77241MLL D001","NHA86M","NHA86M","","COWL,R RR LOWER","1513","2026/02/02","5","77241MLLD00ZD"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE1","NHA86M","","SET ILLUS,L REAR COWL A","1513","2026/02/26","5","77250MLBD80ZD"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE2","NHA86M","","SET ILLUS,L REAR COWL A","1513","2026/02/24","5","77250MLBD80ZC"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE3","NHC65M","","SET ILLUS,L REAR COWL A","1513","2026/02/13","5","77250MLBD80ZB"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE4 1","NHD19M","","SET ILLUS,L REAR COWL A","1513","2026/02/16","5","77250MLBD80ZE"
+"K*SP**","PO","SP","MLB","77250MLB G400","TYPE1","NHB54P","","SET ILLUS,L REAR COWL A","1513","2026/02/05","15","77250MLBG40ZC"
+"K*SP**","PO","SP","MLV","77250MLV J000 01","TYPE1 1","NHD19M","8A+7B","SET ILLUS,L REAR COWL","1513","2026/02/16","10","77250MLVJ00ZD"
+"K*SP**","PO","SP","MLV","77250MLV J100 01","NHB01","NHB01","8A+7B","SET ILLUS,L REAR COWL","1513","2026/02/17","5","77250MLVJ10ZA"
+"K*SP**","PO","SP","MLL","77251MLL D001","NHA86M","NHA86M","","COWL,L RR LOWER","1513","2026/02/03","10","77251MLLD00ZD"
+"K*SP**","PO","SP","MLL","77251MLL D001","NHB53P","NHB53P","","COWL,L RR LOWER","1513","2026/02/18","5","77251MLLD00ZC"
+"K*SP**","PO","SP","MKR","77260MKR D100","TYPE1","NHB01","7B","SET ILLUS,REAR CENTER UPPER COWL","1513","2026/02/04","5","77260MKRD10ZB"
+"K*SP**","PO","SP","MLL","77260MLL D100","NHA86M","NHA86M","8A","SET ILLUS,REAR UPPER COWL","1513","2026/02/03","10","77260MLLD10ZA"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHA86M","NHA86M","D000AA","COWL,L REAR","1513","2026/02/10","10","77261MKTD01ZG"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHB01","NHB01","D000AA","COWL,L REAR","1513","2026/02/10","5","77261MKTD01ZD"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHB53P","NHB53P","D000AA","COWL,L REAR","1513","2026/02/18","5","77261MKTD01ZK"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHC08M","NHC08M","D000AA","COWL,L REAR","1513","2026/02/23","5","77261MKTD01ZC"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHC64M","NHC64M","D000AA","COWL,L REAR","1513","2026/02/05","10","77261MKTD01ZF"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHD05","NHD05","D000AA","COWL,L REAR","1513","2026/02/26","10","77261MKTD01ZH"
+"K*SP**","PO","SP","MKT","77261MKT D010","R380","R380","D000AA","COWL,L REAR","1513","2026/02/24","15","77261MKTD01ZA"
+"K*SP**","PO","SP","MKV","77270MKV D500 01","TYPE2","NHA86M","D500AA","SET ILLUS,L REAR COWL","1513","2026/02/17","5","77270MKVD50ZB"
+"K*SP**","PO","SP","MKT","77413MKT D000","NHC64M","NHC64M","D000AA","COVER,FUEL LID","1513","2026/02/04","5","77413MKTD00ZD"
+"K*SP**","PO","SP","MKT","77413MKT D000","NHD05","NHD05","D000AA","COVER,FUEL LID","1513","2026/02/25","5","77413MKTD00ZG"
+"K*SP**","PO","SP","K88","80100K88 J001","B187","B187","0","FENDER,REAR","1513","2026/02/02","10","80100K88J00ZP"
+"K*SP**","PO","SP","K88","80100K88 J001","B197M","B197M","0","FENDER,REAR","1513","2026/02/03","5","80100K88J00ZJ"
+"K*SP**","PO","SP","K88","80100K88 J001","G142M","G142M","0","FENDER,REAR","1513","2026/02/02","5","80100K88J00ZG"
+"K*SP**","PO","SP","K88","80100K88 J001","G208M","G208M","0","FENDER,REAR","1513","2026/02/27","5","80100K88J00ZU"
+"K*SP**","PO","SP","K88","80100K88 J001","NHC47P","NHC47P","0","FENDER,REAR","1513","2026/02/05","5","80100K88J00ZT"
+"K*SP**","PO","SP","K88","80100K88 J001","YR211","YR211","0","FENDER,REAR","1513","2026/02/18","5","80100K88J00ZB"
+"K*SP**","PO","SP","MKZ","80110MKZ J300","TYPE1","R380","0","SHELTER ASSY,FRONT","1513","2026/02/12","15","80110MKZJ30ZB"
+"K*SP**","PO","SP","MKZ","80110MKZ J300","TYPE1","R380","0","SHELTER ASSY,FRONT","1513","2026/02/13","15","80110MKZJ30ZB"
+"K*SP**","PO","SP","MKZ","80120MKZ J300","R380","R380","8A+7B+8B","SHELTER ASSY,RR","1513","2026/02/12","15","80120MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","80120MKZ J300","R380","R380","8A+7B+8B","SHELTER ASSY,RR","1513","2026/02/13","15","80120MKZJ30ZA"
+"K*SP**","PO","SP","MKC","80122MKC A001","TYPE1","R367C","7B+8A","COVER ASSY A,R SDLBG RR","1513","2026/02/24","5","80122MKCA00ZA"
+"K*SP**","PO","SP","MKC","80122MLJ A000","TYPE2","NHC65M","7B+8A","COVER ASSY A,R SDLBG RR","1513","2026/02/12","5","80122MLJA00ZB"
+"K*SP**","PO","SP","MKC","80122MLJ A000","TYPE3","NHB01","7B+8A","COVER ASSY A,R SDLBG RR","1513","2026/02/05","20","80122MLJA00ZA"
+"K*SP**","PO","SP","MKC","80122MLJ M500","NHC33P","NHC33P","8A","COVER ASSY A,R SDLBG RR","1513","2026/02/19","5","80122MLJM50ZD"
+"K*SP**","PO","SP","MKC","80132MKC A001","TYPE1","R367C","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/25","5","80132MKCA00ZA"
+"K*SP**","PO","SP","MKC","80132MKC A001","TYPE4","NHB70M","8A","COVER ASSY A,L SDLBG RR","1513","2026/02/12","5","80132MKCA00ZD"
+"K*SP**","PO","SP","MKC","80132MLJ A000","TYPE1","R337M","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/18","15","80132MLJA00ZC"
+"K*SP**","PO","SP","MKC","80132MLJ A000","TYPE2","NHC65M","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/13","5","80132MLJA00ZB"
+"K*SP**","PO","SP","MKC","80132MLJ A000","TYPE3","NHB01","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/06","10","80132MLJA00ZA"
+"K*SP**","PO","SP","MKC","80132MLJ M500","NHA86M","NHA86M","8A","COVER ASSY A,L SDLBG RR","1513","2026/02/04","5","80132MLJM50ZB"
+"K*SP**","PO","SP","MKC","80132MLJ M500","NHC33P","NHC33P","8A","COVER ASSY A,L SDLBG RR","1513","2026/02/20","5","80132MLJM50ZD"
+"K*SP**","PO","SP","K88","80151K88 J001","R201","R201","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/13","5","80151K88J00ZJ"
+"K*SP**","PO","SP","K88","80151K88 J001","Y124P","Y124P","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/19","5","80151K88J00ZA"
+"K*SP**","PO","SP","K88","80151K88 J001","YR176","YR176","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/25","5","80151K88J00ZH"
+"K*SP**","PO","SP","MKC","81113MKC A002","NHB70M","NHB70M","8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/10","10","81113MKCA00ZA"
+"K*SP**","PO","SP","MKC","81113MKC L001","TYPE3","NHC52M","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/12","5","81113MKCL00ZA"
+"K*SP**","PO","SP","MKC","81113MKC L301","NHC47P","NHC47P","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/02","5","81113MKCL30ZA"
+"K*SP**","PO","SP","MKC","81113MKC LG00 01","PB417M","PB417M","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/02","5","81113MKCLG0ZB"
+"K*SP**","PO","SP","MKC","81113MLJ A500","NHC64M","NHC64M","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/02","15","81113MLJA50ZA"
+"K*SP**","PO","SP","MKC","81115MKC L300","NHC47P","NHC47P","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/02","5","81115MKCL30ZA"
+"K*SP**","PO","SP","MKC","81115MKC LG01","PB417M","PB417M","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/02","5","81115MKCLG0ZB"
+"K*SP**","PO","SP","MKC","81115MLJ A500","NHC64M","NHC64M","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/02","15","81115MLJA50ZA"
+"K*SP**","PO","SP","MKC","81115MLJ M200","TYPE1","R337M","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/19","5","81115MLJM20ZA"
+"K*SP**","PO","SP","MKC","81116MKC L000","YR387MC","YR387MC","","COVER CENTER,TRUNK LWR","1513","2026/02/25","10","81116MKCL00ZR"
+"K*SP**","PO","SP","MKC","81120MLJ A200","TYPE2","NHC07M/NHC65M","(2TL)8A+7A+7B+8B(EMB)","SET ILLUS,TRUNK LID","1513","2026/02/05","5","81120MLJA20ZA"
+"K*SP**","PO","SP","MKC","81120MLJ M000","TYPE1","NHA30M","(2TL)7B+8A","SET ILLUS,TRUNK LID","1513","2026/02/06","5","81120MLJM00ZA"
+"K*SP**","PO","SP","MKC","81120MLJ M200","TYPE1","R337M","(2TL)7B+8A","SET ILLUS,TRUNK LID","1513","2026/02/19","5","81120MLJM20ZA"
+"K*SP**","PO","SP","K88","81130K88 B500","TYPE1","G208M","クロスカブ","SET ILLUS,R MAIN PIPE COVER","1513","2026/02/27","5","81130K88B50ZD"
+"K*SP**","PO","SP","K88","81140K88 B210","TYPE1","NHB01","クロスカブ くまモン","SET ILLUS,L MAIN PIPE COVER","1513","2026/02/27","5","81140K88B21ZA"
+"K*SP**","PO","SP","K88","81140K88 B500","TYPE3","PB417M","クロスカブ","SET ILLUS,L MAIN PIPE COVER","1513","2026/02/03","5","81140K88B50ZB"
+"K*SP**","PO","SP","MKC","81213MKC A002","NHB70M","NHB70M","8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/11","10","81213MKCA00ZA"
+"K*SP**","PO","SP","MKC","81213MKC L001","TYPE3","NHC52M","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/13","5","81213MKCL00ZA"
+"K*SP**","PO","SP","MKC","81213MKC L301","NHC47P","NHC47P","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/03","5","81213MKCL30ZA"
+"K*SP**","PO","SP","MKC","81213MKC LG00 01","PB417M","PB417M","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/03","5","81213MKCLG0ZB"
+"K*SP**","PO","SP","MKC","81213MLJ A500","NHC64M","NHC64M","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/03","15","81213MLJA50ZA"
+"K*SP**","PO","SP","MKC","81213MLJ M700","YR387M","YR387M","8A+7B+8B","COVER ASSY,L TRUNK SIDE","1513","2026/02/25","5","81213MLJM70ZA"
+"K*SP**","PO","SP","MKC","81320MKC EC00 01","TYPE3","NH463M","7B+8A(EMB)","SET ILLUS,R SADDLEBAG LID","1513","2026/02/04","5","81320MKCEC0ZA"
+"K*SP**","PO","SP","MLA","81320MLA A300","NHC52M","NHC52M","","LID OUTER,R SADDLEBAG","1513","2026/02/12","10","81320MLAA30ZB"
+"K*SP**","PO","SP","MKC","81320MLJ M200","R337M","R337M","8A+7B+8B(EMB)","SET ILLUS,R SADDLEBAG LID","1513","2026/02/17","5","81320MLJM20ZA"
+"K*SP**","PO","SP","MKC","81320MLJ M500","NHA86M","NHA86M","8A","SET ILLUS,R SADDLEBAG LID","1513","2026/02/03","10","81320MLJM50ZA"
+"K*SP**","PO","SP","MKC","81320MLJ M700","YR387M","YR387M","8A+7B+8B(EMB)","SET ILLUS,R SADDLEBAG LID","1513","2026/02/24","10","81320MLJM70ZA"
+"K*SP**","PO","SP","MLA","81363MLA A301","G208M","G208M","","PANEL,R SADDLEBAG","1513","2026/02/27","5","81363MLAA30ZF"
+"K*SP**","PO","SP","MLA","81363MLA A301","NHC65M","NHC65M","","PANEL,R SADDLEBAG","1513","2026/02/12","5","81363MLAA30ZC"
+"K*SP**","PO","SP","MLA","81420MLA A300","NHC52M","NHC52M","","LID OUTER,L SADDLEBAG","1513","2026/02/13","5","81420MLAA30ZB"
+"K*SP**","PO","SP","MKC","81420MLJ M200","R337M","R337M","8A+7B+8B(EMB)","SET ILLUS,L SADDLEBAG LID","1513","2026/02/18","5","81420MLJM20ZA"
+"K*SP**","PO","SP","MKC","81420MLJ M500","NHA86M","NHA86M","8A","SET ILLUS,L SADDLEBAG LID","1513","2026/02/04","10","81420MLJM50ZA"
+"K*SP**","PO","SP","MLA","81463MLA A301","NHC52M","NHC52M","","PANEL,L SADDLEBAG","1513","2026/02/13","10","81463MLAA30ZB"
+"K*SP**","PO","SP","MLA","81463MLA A301","NHC65M","NHC65M","","PANEL,L SADDLEBAG","1513","2026/02/13","5","81463MLAA30ZC"
+"K*SP**","PO","SP","MKC","81491MLJ M500","YR387MC","YR387MC","8A","COVER ASSY,L SADDLEBAG UP","1513","2026/02/25","5","81491MLJM50ZC"
+"K*SP**","PO","SP","MKC","81520MKC A100","NH463M","NH463M","7B","SET ILLUS,RR TOP LID R","1513","2026/02/04","5","81520MKCA10ZN"
+"K*SP**","PO","SP","MKC","81520MKC A100","TYPE1","R367C","7B","SET ILLUS,RR TOP LID R","1513","2026/02/24","10","81520MKCA10ZC"
+"K*SP**","PO","SP","MKC","81520MLJ A000","NHC65M","NHC65M","7B","SET ILLUS,RR TOP LID R","1513","2026/02/05","5","81520MLJA00ZB"
+"K*SP**","PO","SP","MKC","81525MKC A100","NH463M","NH463M","7B","SET ILLUS,RR TOP LID L","1513","2026/02/05","5","81525MKCA10ZN"
+"K*SP**","PO","SP","MKC","81525MLJ A000","NHC65M","NHC65M","7B","SET ILLUS,RR TOP LID L","1513","2026/02/06","5","81525MLJA00ZB"
+"K*SP**","PO","SP","MKC","81550MKC A100","NHA86M","NHA86M","","COVER,CTR RR TOP","1513","2026/02/04","5","81550MKCA10ZK"
+"K*SP**","PO","SP","MKC","81551MKC A100","NHA86M","NHA86M","","LID R,RR TOP","1513","2026/02/03","15","81551MKCA10ZK"
+"K*SP**","PO","SP","MKC","81555MKC A100","NHA86M","NHA86M","","COVER,INNER RR TOP","1513","2026/02/04","15","81555MKCA10ZK"
+"K*SP**","PO","SP","MKC","81556MKC A100","NHA86M","NHA86M","","LID L,RR TOP","1513","2026/02/04","5","81556MKCA10ZK"
+"K*SP**","PO","SP","MKC","81570MKC A100","NHA86M","NHA86M","","COVER,END RR TOP","1513","2026/02/04","5","81570MKCA10ZK"
+"K*SP**","PO","SP","MKC","83140MLJ E100","TYPE1","NHB01","7B(E700)","SET ILLUS,L SIDE SHELTER","1513","2026/02/06","5","83140MLJE10ZC"
+"K*SP**","PO","SP","K64","83160K64 JH01","TYPE2","NHB53P","0","SET ILLUS,R TANK COVER","1513","2026/02/26","5","83160K64JH0ZA"
+"K*SP**","PO","SP","K64","83170K64 J210 01","TYPE1","NH436M","旧型","SET ILLUS,L TANK COVER","1513","2026/02/27","5","83170K64J21ZB"
+"K*SP**","PO","SP","K64","83170K64 JM00","NHB53P","NHB53P","","SET ILLUS,L TANK COVER","1513","2026/02/27","10","83170K64JM0ZA"
+"K*SP**","PO","SP","MKR","83170MKR DH00","R380","R380","8A+7B+8B","COVER ASSY,L SIDE","1513","2026/02/26","10","83170MKRDH0ZA"
+"K*SP**","PO","SP","MLM","83180MLM E000","TYPE1","NHB01","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/19","25","83180MLME00ZC"
+"K*SP**","PO","SP","MLM","83180MLM E000","TYPE2","NHC33P","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/19","25","83180MLME00ZB"
+"K*SP**","PO","SP","MLM","83180MLM E000","TYPE3","NHC47P","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/10","25","83180MLME00ZA"
+"K*SP**","PO","SP","MLM","83190MLM E000","TYPE1","NHB01","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/20","25","83190MLME00ZC"
+"K*SP**","PO","SP","MLM","83190MLM E000","TYPE2","NHC33P","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/20","25","83190MLME00ZB"
+"K*SP**","PO","SP","MLM","83190MLM E000","TYPE3","NHC47P","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/11","25","83190MLME00ZA"
+"K*SP**","PO","SP","MLM","83510MLM E000","TYPE1","NHB01","8A+7B+8B","COVER A ASSY,R SIDE","1513","2026/02/23","15","83510MLME00ZC"
+"K*SP**","PO","SP","MLM","83510MLM E000","TYPE2","NHC33P","8A+7B+8B","COVER A ASSY,R SIDE","1513","2026/02/19","15","83510MLME00ZB"
+"K*SP**","PO","SP","MLM","83510MLM E000","TYPE3 2","NHC47P","8A+7B+8B","COVER A ASSY,R SIDE","1513","2026/02/10","15","83510MLME00ZD"
+"K*SP**","PO","SP","MKW","83520MKW D000","TYPE1","NHA86M","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/19","5","83520MKWD00ZD"
+"K*SP**","PO","SP","MKW","83520MKW D000","TYPE2","NHB53P","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/17","5","83520MKWD00ZC"
+"K*SP**","PO","SP","MKW","83520MKW D000","TYPE4","B197M","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/04","5","83520MKWD00ZA"
+"K*SP**","PO","SP","MLM","83520MLM E000","TYPE1","YR396M","7B","SET ILLUS,R SIDE COVER B","1513","2026/02/06","15","83520MLME00ZC"
+"K*SP**","PO","SP","MLM","83520MLM E000","TYPE2","NHB01","7B","SET ILLUS,R SIDE COVER B","1513","2026/02/19","15","83520MLME00ZB"
+"K*SP**","PO","SP","MLM","83520MLM E000","TYPE3","NHC08M","7B","SET ILLUS,R SIDE COVER B","1513","2026/02/26","15","83520MLME00ZA"
+"K*SP**","PO","SP","K3R","83530K3R J000 02","NH389M","NH389M","","SET ILLUS,R SIDE COVER","1513","2026/02/25","5","83530K3RJ00ZE"
+"K*SP**","PO","SP","K3R","83530K3R J000 02","Y248","Y248","","SET ILLUS,R SIDE COVER","1513","2026/02/18","5","83530K3RJ00ZD"
+"K*SP**","PO","SP","MLM","83600MLM E000","TYPE1","NHB01","8A+7B","SET ILLUS,L SIDE COVER A","1513","2026/02/24","15","83600MLME00ZF"
+"K*SP**","PO","SP","MLM","83600MLM E000","TYPE2","NHC33P","8A+7B","SET ILLUS,L SIDE COVER A","1513","2026/02/20","15","83600MLME00ZE"
+"K*SP**","PO","SP","MLM","83600MLM E000","TYPE3 1","NHC47P","8A+7B","SET ILLUS,L SIDE COVER A","1513","2026/02/11","15","83600MLME00ZG"
+"K*SP**","PO","SP","MLN4","83600MLN ER00","NHC64M","NHC64M","4型 8A","COWL ASSY,R RR SIDE","1513","2026/02/06","5","83600MLNER0ZA"
+"K*SP**","PO","SP","MKS1","83610MLG E500","TYPE1","B197M","1型 8A+7B","SET ILLUS,R RR SIDE COWL A","1513","2026/02/04","5","83610MLGE50ZA"
+"K*SP**","PO","SP","MKC","83610MLJ A000","TYPE1","NHB01","7B","SET ILLUS,R SIDE COVER","1513","2026/02/05","5","83610MLJA00ZC"
+"K*SP**","PO","SP","MKC","83610MLJ AA00","TYPE2","G208M","7B","SET ILLUS,R SIDE COVER","1513","2026/02/27","5","83610MLJAA0ZA"
+"K*SP**","PO","SP","MLV","83610MLV J000","TYPE1 1","NHD19M","8A+7B","SET ILLUS,R SIDE COVER","1513","2026/02/13","5","83610MLVJ00ZD"
+"K*SP**","PO","SP","MKC","83611MKC A000","NH389M","NH389M","0","COVER A,R SIDE","1513","2026/02/24","5","83611MKCA00ZW"
+"K*SP**","PO","SP","MKC","83611MKC A000","NHA86M","NHA86M","0","COVER A,R SIDE","1513","2026/02/03","10","83611MKCA00ZH"
+"K*SP**","PO","SP","MKPX","83611MKP J800","NHB70M","NHB70M","J800AA","COVER A,L SIDE","1513","2026/02/12","5","83611MKPJ80ZD"
+"K*SP**","PO","SP","MLF","83611MLF E800","PB409PC","PB409PC","E800AA","COWL A,R RR SIDE","1513","2026/02/27","15","83611MLFE80ZB"
+"K*SP**","PO","SP","MKW","83620MKW D000","TYPE3","R380","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/24","5","83620MKWD00ZB"
+"K*SP**","PO","SP","MLM","83620MLM E000","TYPE1","YR396M","7B","SET ILLUS,L SIDE COVER B","1513","2026/02/09","15","83620MLME00ZC"
+"K*SP**","PO","SP","MLM","83620MLM E000","TYPE2","NHB01","7B","SET ILLUS,L SIDE COVER B","1513","2026/02/20","15","83620MLME00ZB"
+"K*SP**","PO","SP","MLM","83620MLM E000","TYPE3","NHC08M","7B","SET ILLUS,L SIDE COVER B","1513","2026/02/27","15","83620MLME00ZA"
+"K*SP**","PO","SP","MKW","83621MKW D700","NHB54P","NHB54P","D700AA","SHELTER,L SIDE","1513","2026/02/05","5","83621MKWD70ZC"
+"K*SP**","PO","SP","K3R","83630K3R J000 02","NH389M","NH389M","カット","SET ILLUS,L SIDE COVER","1513","2026/02/26","5","83630K3RJ00ZE"
+"K*SP**","PO","SP","K3R","83630K3R J000 02","Y248","Y248","カット","SET ILLUS,L SIDE COVER","1513","2026/02/19","5","83630K3RJ00ZD"
+"K*SP**","PO","SP","K64","83635K64 JH01","TYPE1","NHB01","23YM","SET ILLUS,L REAR COWL","1513","2026/02/27","20","83635K64JH0ZB"
+"K*SP**","PO","SP","K64","83650K64 NP00","NH389M","NH389M","25YM","COVER,SEAT LOCK","1513","2026/02/27","3","83650K64NP0ZF"
+"K*SP**","PO","SP","MKS1","83650MKS E000 04","TYPE1","NHA86M","1型 7B","SET ILLUS,R RR SIDE COWL C","1513","2026/02/05","10","83650MKSE00ZA"
+"K*SP**","PO","SP","MJC","83701MJC A000","R380","R380","0","COVER,L SIDE","1513","2026/02/26","5","83701MJCA00ZD"
+"K*SP**","PO","SP","MKC","83710MLJ M200","TYPE1","R337M","7B","SET ILLUS,L SIDE COVER","1513","2026/02/18","5","83710MLJM20ZA"
+"K*SP**","PO","SP","MKC","83711MKC A000","NH389M","NH389M","0","COVER A,L SIDE","1513","2026/02/26","5","83711MKCA00ZW"
+"K*SP**","PO","SP","MKC","83711MKC A000","YR387MC","YR387MC","0","COVER A,L SIDE","1513","2026/02/25","5","83711MKCA00ZV"
+"K*SP**","PO","SP","GJB","83712GJB J000","NHC08M","NHC08M","0","COVER,RR CENTER","1513","2026/02/20","10","83712GJBJ00YB"
+"K*SP**","PO","SP","GX1","83712GJB J000","R134","R134","0","COVER,RR CENTER","1513","2026/02/23","5","83712GJBJ00ZT"
+"K*SP**","PO","SP","MKS1","83750MKS E000 04","TYPE1","NHA86M","1型 7B","SET ILLUS,L RR SIDE COWL C","1513","2026/02/06","5","83750MKSE00ZA"
+"K*SP**","PO","SP","MKC","88130MLJ M000 01","YR387MC","YR387MC","(ミネベア素材)","COVER,R MIRROR","1513","2026/02/24","15","88130MLJM00ZE"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE1","R367C","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/24","5","88135MKCA00ZE"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE2","NHB53P","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/13","5","88135MKCA00ZD"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE3","YR347P","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/03","5","88135MKCA00ZC"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE4","NHB70M","0","SET ILLUS,R MIRROR COVER","1513","2026/02/10","5","88135MKCA00ZB"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE5","NH463M","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/04","25","88135MKCA00ZA"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE6","PB409P","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/10","5","88135MKCA00ZF"
+"K*SP**","PO","SP","MKC","88135MKC L200","TYPE1","NHC33P","(KENSEI)7B","SET ILLUS,R MIRROR COVER","1513","2026/02/19","10","88135MKCL20ZA"
+"K*SP**","PO","SP","MKC","88135MLJ M000 01","TYPE1","NHA30M","(ミネベア素材)7B","SET ILLUS,R MIRROR COVER","1513","2026/02/06","5","88135MLJM00ZA"
+"K*SP**","PO","SP","MKC","88135MLJ M200 01","TYPE1","R337M","(ミネベア素材)7B","SET ILLUS,R MIRROR COVER","1513","2026/02/17","20","88135MLJM20ZA"
+"K*SP**","PO","SP","MKC","88140MLJ M000 01","YR387MC","YR387MC","(ミネベア素材)","COVER,L MIRROR","1513","2026/02/25","5","88140MLJM00ZE"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE1","R367C","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/25","15","88145MKCA00ZE"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE2","NHB53P","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/16","20","88145MKCA00ZD"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE3","YR347P","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/02","10","88145MKCA00ZC"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE4","NHB70M","0","SET ILLUS,L MIRROR COVER","1513","2026/02/11","5","88145MKCA00ZB"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE5","NH463M","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/05","10","88145MKCA00ZA"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE6","PB409P","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/11","10","88145MKCA00ZF"
+"K*SP**","PO","SP","MKC","88145MLJ A000","TYPE1","NHB01","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/06","25","88145MLJA00ZA"
+"K*SP**","PO","SP","MKC","88145MLJ AR00","TYPE1","NHC47P","(ミネベア素材)7B","SET ILLUS,L MIRROR COVER","1513","2026/02/06","10","88145MLJAR0ZD"
+"K*SP**","PO","SP","MKC","88145MLJ M000 01","TYPE1","NHA30M","(ミネベア素材)7B","SET ILLUS,L MIRROR COVER","1513","2026/02/09","5","88145MLJM00ZA"
+"K*SP**","PO","SP","MKC","88145MLJ M200 01","TYPE1","R337M","(ミネベア素材)7B","SET ILLUS,L MIRROR COVER","1513","2026/02/18","5","88145MLJM20ZA"
diff --git a/docs/060 データ/20260310-163249_PoSpPlan_20260310_163249(BOM付き).csv b/docs/060 データ/20260310-163249_PoSpPlan_20260310_163249(BOM付き).csv
new file mode 100644
index 0000000..0e03b67
--- /dev/null
+++ b/docs/060 データ/20260310-163249_PoSpPlan_20260310_163249(BOM付き).csv
@@ -0,0 +1,622 @@
+PlanCd,HaraiMoto,HaraiSaki,ModelCd,SeppenBuban,TargetColor,KakoColor,Biko,Buhinmei,KoteiCd,SeisanHiduke,Daisu,SpBuban
+"K*SP**","PO","AF","K88","53215K88 J000 03","NH388","NH388","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/20","10","53215K88J00ZD"
+"K*SP**","PO","AF","K88","53215K88 J000 03","PB394M","PB394M","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/06","20","53215K88J00ZC"
+"K*SP**","PO","AF","K88","53215K88 J000 03","Y124P","Y124P","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/19","10","53215K88J00ZA"
+"K*SP**","PO","AF","K88","53215K88 J000 03","Y163P","Y163P","スタンダード","COVER ASSY,HNDL UPPER","1521","2026/02/09","5","53215K88J00ZK"
+"K*SP**","PO","AF","MKA1.3","61100MGS D301 02","NHB01","NHB01","1・3型","FENDER COMP,FR","1521","2026/02/04","25","61100MGSD30ZF"
+"K*SP**","PO","AF","K88","61500K88 J001","Y163P","Y163P","スタンダード","COVER ASSY,R FR FORK","1521","2026/02/06","5","61500K88J00ZL"
+"K*SP**","PO","AF","K88","61500K88 J001","YR211","YR211","スタンダード","COVER ASSY,R FR FORK","1521","2026/02/18","10","61500K88J00ZB"
+"K*SP**","PO","AF","K88","61600K88 J001","Y163P","Y163P","スタンダード","COVER ASSY,L FR FORK","1521","2026/02/09","10","61600K88J00ZL"
+"K*SP**","PO","AF","K88","61600K88 J001","YR211","YR211","スタンダード","COVER ASSY,L FR FORK","1521","2026/02/19","10","61600K88J00ZB"
+"K*SP**","PO","AF","MKYJ","64100MKY E000","NHA86M","NHA86M","MKY E000AA","COWL COMP,FR UPPER","1521","2026/02/19","5","64100MKYE00ZB"
+"K*SP**","PO","AF","MLA","64205MLA A301 01","NHC65M","NHC65M","0","COWL ASSY,FR","1521","2026/02/12","15","64205MLAA30ZD"
+"K*SP**","PO","AF","MLA","64300MLA AH00 02","NHC47P","NHC47P","","COWL ASSY,HEAD LIGHT","1521","2026/02/09","20","64300MLAAH0ZD"
+"K*SP**","PO","AF","MLN4","64300MLN ER00","NHC64M","NHC64M","4型 8A ストのみ","COWL ASSY,R MIDDLE","1521","2026/02/06","15","64300MLNER0ZA"
+"K*SP**","PO","AF","MLN4","64300MLN ET00 01","NHB53P","NHB53P","4型 8A+7B ラバーなし","COWL ASSY,R MIDDLE","1521","2026/02/19","15","64300MLNET0ZA"
+"K*SP**","PO","AF","MLL","64335MLL D000 01","TYPE4","NHA86M","8A","COVER ASSY,R FUEL TANK","1521","2026/02/02","15","64335MLLD00ZA"
+"K*SP**","PO","AF","MKC","81200MKC A102","NHB70M","NHB70M","IN LID + TL_OLD","LID ASSY,TRUNK","1521","2026/02/09","10","81200MKCA10ZA"
+"K*SP**","PO","AF","MKC","81200MKC L301","NHA86M","NHA86M","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/02","5","81200MKCL30ZA"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/12","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/13","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/16","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/17","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MKC","81200MKC LG00","NHC33P","NHC33P","7B (IN LID + 2TL +R/L TL CVR)","LID ASSY,TRUNK(NEW)","1521","2026/02/18","10","81200MKCLG0ZB"
+"K*SP**","PO","AF","MLA","81300MLA A300 08","NHC65M","NHC65M","LID + PANEL","SADDLEBAG ASSY,R","1521","2026/02/16","16","81300MLAA30ZC"
+"K*SP**","PO","AF","MLA","81400MLA A300 08","NHC65M","NHC65M","LID + PANEL","SADDLEBAG ASSY,L","1521","2026/02/17","20","81400MLAA30ZC"
+"K*SP**","PO","AF","MKC","81560MKC A102","NH463M","NH463M","7B (CTR+INN+END)","COVER ASSY,CTR RR TOP","1521","2026/02/04","5","81560MKCA10ZH"
+"K*SP**","PO","AF","MKC","81560MLJ A000","NHC65M","NHC65M","7B (CTR+INN+END)","COVER ASSY,CTR RR TOP","1521","2026/02/05","5","81560MLJA00ZB"
+"K*SP**","PO","AF","MKC","83105MLJ M000","TYPE1","NHA30M","7B","LID ASSY,FUEL","1521","2026/02/06","5","83105MLJM00ZA"
+"K*SP**","PO","AF","MKC","83210MKC A002","TYPE4","NHB70M","LID + BUTTON","CENTER POCKET ASSY","1521","2026/02/09","5","83210MKCA00ZF"
+"K*SP**","PO","AF","MLN1","83600MLN E300 02","TYPE2","NHB53P","1型 8A+7B","COWL ASSY,R RR SIDE","1521","2026/02/19","5","83600MLNE30ZA"
+"K*SP**","PO","AF","GAG","64300GFZ J000 02","NH138","NH138","0","COVER,SET ILLUST FRONT","1521","2026/02/04","30","64300GFZJ00ZA"
+"K*SP**","PO","AF","KSE","80010KSE 3060","TYPE1","R292R","0","FENDER SET ILLUST,REAR","1521","2026/02/03","8","80010KSE306ZA"
+"K*SP**","PO","AF","KSE","80010KSE 3060","TYPE1","R292R","0","FENDER SET ILLUST,REAR","1521","2026/02/18","7","80010KSE306ZA"
+"K*SP**","PO","AF","KSE","80101KSE A301","TYPE1","R292R","0","SET ILLUST,REAR FENDER","1521","2026/02/03","15","80101KSEA30ZA"
+"K*SP**","PO","AF","KSE","80101KSE A301","TYPE1","R292R","0","SET ILLUST,REAR FENDER","1521","2026/02/18","15","80101KSEA30ZA"
+"K*SP**","PO","AF","MKC","81100MKC L310","","","BOX LWR + BOX UPR","TRUNK SUB ASSY","1521","2026/02/09","25","81100MKCL31"
+"K*SP**","PO","AF","MKC","81100MKC L310","","","BOX LWR + BOX UPR","TRUNK SUB ASSY","1521","2026/02/25","5","81100MKCL31"
+"K*SP**","PO","AF","K88","83701K88 L203 01","T23","T23","スタンダード","COVER COMP,L BODY","1521","2026/02/04","5","83701K88L20ZA"
+"K*SP**","PO","SP","KSE","19071KSE V100","TYPE1","R292R","","SET ILLUST,R TANK SHROUD","1513","2026/02/16","5","19071KSEV10ZA"
+"K*SP**","PO","SP","MCT","50611MEF J000AB","","SOZAI","教習車","SKIRT R RLOOR(KAKOU)","1513","2026/02/25","5","50611MEFJ00AB"
+"K*SP**","PO","SP","MKE","51710MKE AU00","TYPE1","R292R","0","SET ILLUS,R FR FORK PROTECTOR","1513","2026/02/17","5","51710MKEAU0ZA"
+"K*SP**","PO","SP","KVZ","61100KVZ 6300AA","","SOZAI","0","FRONT FENDER(SOZAI)","1513","2026/02/26","5","61100KVZ630AA"
+"K*SP**","PO","SP","MFL","61100MFL 0000AB","","SOZAI","0","FENDER FRONT(SANDING)","1513","2026/02/03","5","61100MFL000AB"
+"K*SP**","PO","SP","MKA1.3","61100MGS D302AB","","SOZAI","1・3型","FENDER FR(SANDING)","1513","2026/02/02","40","61100MGSD30AB"
+"K*SP**","PO","SP","MKA1.3","61100MGS D302AB","","SOZAI","1・3型","FENDER FR(SANDING)","1513","2026/02/03","25","61100MGSD30AB"
+"K*SP**","PO","SP","MCA","61101MCA 0000AB","","SOZAI","0","FENDER,FR(SANDING)","1513","2026/02/03","5","61101MCA000AB"
+"K*SP**","PO","SP","MCA","61103MCA 0000AB","","SOZAI","0","FENDER,FR,B(SANDING)","1513","2026/02/09","40","61103MCA000AB"
+"K*SP**","PO","SP","MCA","61103MCA A80120","","SOZAI","ABS","FENDER","1513","2026/02/26","5","61103MCAA8020"
+"K*SP**","PO","SP","HP1","61110HP1 60002101","NH196","NH196","0","SHROUD,R","1513","2026/02/23","40","61110HP1600ZC"
+"K*SP**","PO","SP","HP1","61120HP1 60002101","NH196","NH196","0","FENDER,R","1513","2026/02/24","40","61120HP1600ZC"
+"K*SP**","PO","SP","V61","61151V61 J000 01","","","0","COVER,MOTOR","1513","2026/02/12","10","61151V61J00"
+"K*SP**","PO","SP","V61","61151V61 J000 01","","","0","COVER,MOTOR","1513","2026/02/13","10","61151V61J00"
+"K*SP**","PO","SP","MW3","61301MW3 A900","NH1","NH1","MFM","CASE HEAD LIGHT","1513","2026/02/09","15","61301MW3A90ZA"
+"K*SP**","PO","SP","MCA","64110MCA S400AB","","SOZAI","0","GARNISH SCREEN(SANDING)","1513","2026/02/19","10","64110MCAS40AB"
+"K*SP**","PO","SP","MKC","64110MKC A000AB","","SOZAI","","GARNISH A,SCREEN(SANDING)","1513","2026/02/26","25","64110MKCA00AB"
+"K*SP**","PO","SP","MKV","64111MKV D000AA","","SOZAI","0","COWL,FRONT(SOZAI)","1513","2026/02/20","5","64111MKVD00AA"
+"K*SP**","PO","SP","MGE","64130MGE 0000AB","","SOZAI","0","COWL R UPPER SIDE(SANDING)","1513","2026/02/11","5","64130MGE000AB"
+"K*SP**","PO","SP","MJR","64160MJR 6700AB","","SOZAI","0","COVER L FORK FR(SANDING)","1513","2026/02/16","5","64160MJR670AB"
+"K*SP**","PO","SP","MGP","64211MGP D000AB","","SOZAI","0","COWL UPPER(SANDING)","1513","2026/02/17","5","64211MGPD00AB"
+"K*SP**","PO","SP","MKT","64211MKT D000AB","","SOZAI","D000AA 旧型","COWL,UPPER(SANDING)","1513","2026/02/20","25","64211MKTD00AB"
+"K*SP**","PO","SP","MLB","64215MLB D000AB","","SOZAI","","COWL R,HEAD LIGHT SIDE(SANDING)","1513","2026/02/25","10","64215MLBD00AB"
+"K*SP**","PO","SP","MCA","64216MCA 0000AA","","SOZAI","0","COWL,FR CENTER(SOZAI)","1513","2026/02/25","5","64216MCA000AA"
+"K*SP**","PO","SP","GAG","64220GAG 7512","NH187R","NH187R","0","ROOF","1513","2026/02/04","30","64220GAG751ZB"
+"K*SP**","PO","SP","GAG","64220GAG 7512","NH187R","NH187R","0","ROOF","1513","2026/02/05","30","64220GAG751ZB"
+"K*SP**","PO","SP","MKV","64221MKV D000AA","","SOZAI","0","COVER,FR INNER(SOZAI)","1513","2026/02/20","5","64221MKVD00AA"
+"K*SP**","PO","SP","MLB","64225MLB D000AB","","SOZAI","","COWL L,HEAD LIGHT SIDE(SANDING)","1513","2026/02/12","15","64225MLBD00AB"
+"K*SP**","PO","SP","MFM","64231MFM C300AB","","SOZAI","J000AA","COWL,L SIDE(SANDING)","1513","2026/02/16","5","64231MFMC30AB"
+"K*SP**","PO","SP","MKH","64280MKH D000AB","","SOZAI","0","DUCT,R AIR(SANDING)","1513","2026/02/25","10","64280MKHD00AB"
+"K*SP**","PO","SP","MCA","64285MCA S400AB","","SOZAI","0","COWL R MIDDLE(SANDING)","1513","2026/02/13","15","64285MCAS40AB"
+"K*SP**","PO","SP","MCA","64285MCA S400AB","","SOZAI","0","COWL R MIDDLE(SANDING)","1513","2026/02/16","5","64285MCAS40AB"
+"K*SP**","PO","SP","MGS3","64290MGS D304AB","","SOZAI","旧3型","DUCT,L AIR(SANDING)","1513","2026/02/03","5","64290MGSD30AB"
+"K*SP**","PO","SP","MCA","64292MCA S400AB","","SOZAI","0","COWL L SIDE(SANDING)","1513","2026/02/18","10","64292MCAS40AB"
+"K*SP**","PO","SP","MCA","64295MCA S400AB","","SOZAI","0","COWL L MIDDLE(SANDING)","1513","2026/02/17","10","64295MCAS40AB"
+"K*SP**","PO","SP","GGZ","64301GGZ J001AA","","SOZAI","0","COVER,FR(SOZAI)","1513","2026/02/10","10","64301GGZJ00AA"
+"K*SP**","PO","SP","GJA","64301GJA J000AA","","SOZAI","0","COVER,FR(SOZAI)","1513","2026/02/10","45","64301GJAJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/16","50","64301GJBJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/17","50","64301GJBJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/18","50","64301GJBJ00AA"
+"K*SP**","PO","SP","GJB","64301GJB J000AA","","SOZAI","0","COVER FR(SOZAI)","1513","2026/02/19","45","64301GJBJ00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/02","25","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/03","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/04","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/05","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/06","50","64301GX1J00AA"
+"K*SP**","PO","SP","GX1","64301GX1 J000AA","","SOZAI","","COVER FR(SOZAI)","1513","2026/02/09","50","64301GX1J00AA"
+"K*SP**","PO","SP","K88","64301K88 J000AA","","SOZAI","スタンダード","COVER,FRONT(SOZAI)","1513","2026/02/09","5","64301K88J00AA"
+"K*SP**","PO","SP","MCT","64301MCT 0000AA","","SOZAI","0","COVER,FR (SOZAI)","1513","2026/02/12","8","64301MCT000AA"
+"K*SP**","PO","SP","MCT","64301MCT 0000AA","","SOZAI","0","COVER,FR (SOZAI)","1513","2026/02/13","7","64301MCT000AA"
+"K*SP**","PO","SP","MFT","64301MFT 6400AA","","SOZAI","0","COVER FRONT(SOZAI)","1513","2026/02/24","5","64301MFT640AA"
+"K*SP**","PO","SP","GJB","64303GJB J000AA","","SOZAI","0","COVER,FR TOP(SOZAI)","1513","2026/02/04","10","64303GJBJ00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/02","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/03","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/04","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/05","20","64303GX1J00AA"
+"K*SP**","PO","SP","GX1","64303GX1 J000AA","","SOZAI","0","COVER FR TOP(SOZAI)","1513","2026/02/06","10","64303GX1J00AA"
+"K*SP**","PO","SP","MGH","64310MGH 6400AB","","SOZAI","0","COWL R MIDDLE(SANDING)","1513","2026/02/06","15","64310MGH640AB"
+"K*SP**","PO","SP","MGP","64310MGP D000AB","","SOZAI","0","COWL,R MIDDLE(SANDING)","1513","2026/02/17","5","64310MGPD00AB"
+"K*SP**","PO","SP","MFT","64311MFT 6600","NH1","NH1","教習車用","COVER,INNER","1513","2026/02/24","5","64311MFT660ZA"
+"K*SP**","PO","SP","MKK","64311MKK D200AB","","SOZAI","0","COWL R,MIDDLE(SANDING)","1513","2026/02/24","15","64311MKKD20AB"
+"K*SP**","PO","SP","MKS1","64311MKS E000AB","","SOZAI","","COWL R,MIDDLE(SANDING)","1513","2026/02/25","5","64311MKSE00AB"
+"K*SP**","PO","SP","MKS2","64311MKS E200AB","","SOZAI","","COWL R,MIDDLE(SANDING)","1513","2026/02/18","5","64311MKSE20AB"
+"K*SP**","PO","SP","MKV","64311MKV D000AB","","SOZAI","","COWL,R FRONT SIDE(SANDING)","1513","2026/02/09","20","64311MKVD00AB"
+"K*SP**","PO","SP","MKV","64311MKV D000AB","","SOZAI","","COWL,R FRONT SIDE(SANDING)","1513","2026/02/10","20","64311MKVD00AB"
+"K*SP**","PO","SP","MLF","64311MLF E000AB","","SOZAI","","COWL,R MIDDLE COWL(SANDING)","1513","2026/02/23","15","64311MLFE00AB"
+"K*SP**","PO","SP","MLF","64311MLF E000AB","","SOZAI","","COWL,R MIDDLE COWL(SANDING)","1513","2026/02/24","20","64311MLFE00AB"
+"K*SP**","PO","SP","MKR","64312MKR D100AB","","SOZAI","","COWL,R MIDDLE(SANDING)","1513","2026/02/19","10","64312MKRD10AB"
+"K*SP**","PO","SP","MKT","64313MKT D000AB","","SOZAI","D000AA 旧型","LID,POCKET(SANDING)","1513","2026/02/20","5","64313MKTD00AB"
+"K*SP**","PO","SP","MKC","64315MKC A000AB","","SOZAI","","COWL R MIDDLE(SANDING)","1513","2026/02/02","15","64315MKCA00AB"
+"K*SP**","PO","SP","MKH","64320MKH D000AB","","SOZAI","0","COWL,R SIDE(SANDING)","1513","2026/02/16","15","64320MKHD00AB"
+"K*SP**","PO","SP","MGE","64321MGE 0000AB","","SOZAI","2次加工","COWL L MIDDLE(SANDING)","1513","2026/02/11","5","64321MGE000AB"
+"K*SP**","PO","SP","MJM","64325MJM D000AB","","SOZAI","","COWL,L MIDDLE(SANDING)","1513","2026/02/04","5","64325MJMD00AB"
+"K*SP**","PO","SP","MKC","64325MKC A000AB","","SOZAI","","COWL L,MIDDLE(SANDING)","1513","2026/02/03","15","64325MKCA00AB"
+"K*SP**","PO","SP","MKW","64330MKW DB00","TYPE2","NHC99R","DB00","SET ILLUS,R MIDDLE COWL","1513","2026/02/23","5","64330MKWDB0ZA"
+"K*SP**","PO","SP","MLB","64330MLB D000AB","","SOZAI","0","SHROUD R(SANDING)","1513","2026/02/12","30","64330MLBD00AB"
+"K*SP**","PO","SP","MLB","64330MLB D000AB","","SOZAI","0","SHROUD R(SANDING)","1513","2026/02/13","30","64330MLBD00AB"
+"K*SP**","PO","SP","MLB","64330MLB D000AB","","SOZAI","0","SHROUD R(SANDING)","1513","2026/02/16","15","64330MLBD00AB"
+"K*SP**","PO","SP","MLRR","64330MLR Y800 01","","","","COVER ASSY,R TANK","1513","2026/02/10","5","64330MLRY80"
+"K*SP**","PO","SP","MFT","64331MFT 6600AB","","SOZAI","教習車","PANEL R FLOOR SIDE(KAKOU)","1513","2026/02/23","5","64331MFT660AB"
+"K*SP**","PO","SP","KVZ","64336KVZ K102","","","0","PANEL,FR METER","1513","2026/02/03","5","64336KVZK10"
+"K*SP**","PO","SP","MKW","64340MKW DB00","TYPE2","NHC99R","DB00","SET ILLUS,L MIDDLE COWL","1513","2026/02/24","5","64340MKWDB0ZA"
+"K*SP**","PO","SP","MLB","64340MLB D000AB","","SOZAI","","SHROUD L(SANDING)","1513","2026/02/19","30","64340MLBD00AB"
+"K*SP**","PO","SP","MKW","64341MKW D000AB","","SOZAI","0","COWL A,L MIDDLE(SANDING)","1513","2026/02/03","5","64341MKWD00AB"
+"K*SP**","PO","SP","MLC","64341MLC D000AB","","SOZAI","","COWL,R SIDE(SANDING)","1513","2026/02/06","10","64341MLCD00AB"
+"K*SP**","PO","SP","MGH","64360MGH 6400AB","","SOZAI","0","COWL L MIDDLE(SANDING)","1513","2026/02/19","5","64360MGH640AB"
+"K*SP**","PO","SP","MGP","64360MGP D000AB","","SOZAI","0","COWL L MIDDLE(SANDING)","1513","2026/02/18","5","64360MGPD00AB"
+"K*SP**","PO","SP","MJC","64360MJC A001AB","","SOZAI","0","COWL,L MIDDLE(SANDING)","1513","2026/02/02","5","64360MJCA00AB"
+"K*SP**","PO","SP","MLRR","64360MLR Y800 01","","","","COVER ASSY,L TANK","1513","2026/02/11","15","64360MLRY80"
+"K*SP**","PO","SP","MJP","64361MJP G501AB01","","SOZAI","0","COWL,L MIDDLE(SANDING)","1513","2026/02/02","20","64361MJPG50AB"
+"K*SP**","PO","SP","MKV","64361MKV D000AB","","SOZAI","0","COWL,L FRONT SIDE(SANDING)","1513","2026/02/24","30","64361MKVD00AB"
+"K*SP**","PO","SP","MLF","64361MLF E000AB","","SOZAI","","COWL L MIDDLE(SANDING)","1513","2026/02/25","20","64361MLFE00AB"
+"K*SP**","PO","SP","MLF","64361MLF E000AB","","SOZAI","","COWL L MIDDLE(SANDING)","1513","2026/02/26","20","64361MLFE00AB"
+"K*SP**","PO","SP","MKH","64370MKH D000AB","","SOZAI","0","COWL,L SIDE(SANDING)","1513","2026/02/17","10","64370MKHD00AB"
+"K*SP**","PO","SP","MKF","64406MKF D400AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/04","5","64406MKFD40AB"
+"K*SP**","PO","SP","MFJ","64410MFJ A400AB","","SOZAI","MFJH新型","COWL,R UNDER(SANDING)","1513","2026/02/04","10","64410MFJA40AB"
+"K*SP**","PO","SP","MGP","64410MGP D000AB","","SOZAI","0","COWL R UNDER(SANDING)","1513","2026/02/17","5","64410MGPD00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/03","15","64410MJCA00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/04","20","64410MJCA00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/05","20","64410MJCA00AB"
+"K*SP**","PO","SP","MJC","64410MJC A000AB","","SOZAI","0","COWL,R UNDER(SANDING)","1513","2026/02/06","20","64410MJCA00AB"
+"K*SP**","PO","SP","MKA2","64410MJL D700AB","","SOZAI","MKA","SKIRT R FRONT FLOOR(SANDING)","1513","2026/02/09","5","64410MJLD70AB"
+"K*SP**","PO","SP","MGH","64460MGH 6400AB","","SOZAI","0","COWL L UNDER(SANDING)","1513","2026/02/19","5","64460MGH640AB"
+"K*SP**","PO","SP","MGP","64460MGP D000AB","","SOZAI","0","COWL,L UNDER(SANDING)","1513","2026/02/18","5","64460MGPD00AB"
+"K*SP**","PO","SP","MJC","64460MJC A000AB","","SOZAI","","COWL,L UNDER(SANDING)","1513","2026/02/02","5","64460MJCA00AB"
+"K*SP**","PO","SP","MKH","64460MKH D000AA","","SOZAI","0","COVER,L SKIRT(SOZAI)","1513","2026/02/17","10","64460MKHD00AA"
+"K*SP**","PO","SP","MGE","64471MGE 0000AB","","SOZAI","0","COVER R FUEL TANK(SANDING)","1513","2026/02/11","5","64471MGE000AB"
+"K*SP**","PO","SP","MKT","64471MKT D000AA","","SOZAI","D000AA","COVER,L SKIRT(SOZAI)","1513","2026/02/20","25","64471MKTD00AA"
+"K*SP**","PO","SP","MCA","64501MCA A601","","","0","COWL,CTR INNER","1513","2026/02/06","15","64501MCAA60"
+"K*SP**","PO","SP","MCA","64503MCA A601","","","0","COWL,L INNER","1513","2026/02/06","5","64503MCAA60"
+"K*SP**","PO","SP","MCA","64503MCA S400","","","0","COWL,L INNER","1513","2026/02/20","5","64503MCAS40"
+"K*SP**","PO","SP","V17","65141V17 0001","G193R","G193R","0","FENDER,R FRONT","1513","2026/02/09","10","65141V17000ZA"
+"K*SP**","PO","SP","MFP","77210MFP N901XB","","SOZAI","0","COWL COMP,REAR","1513","2026/02/05","15","77210MFPN90XB"
+"K*SP**","PO","SP","MGP","77211MGP D000AB","","SOZAI","0","SEAT COWL(SANDIG)","1513","2026/02/18","5","77211MGPD00AB"
+"K*SP**","PO","SP","MKV","77221MKV D000AA","","SOZAI","","COWL,R REAR(SOZAI)","1513","2026/02/05","15","77221MKVD00AA"
+"K*SP**","PO","SP","MKA2","77230MKA D700AA","","SOZAI","","COWL,L REAR(SOZAI)","1513","2026/02/09","5","77230MKAD70AA"
+"K*SP**","PO","SP","MFM","77231MFM C000AB","","SOZAI","MFM新型","COWL RR CENTER(SANDING)","1513","2026/02/13","5","77231MFMC00AB"
+"K*SP**","PO","SP","MKF","77231MKF D400AA","","SOZAI","0","COWL,REAR UNDER(SOZAI)","1513","2026/02/23","5","77231MKFD40AA"
+"K*SP**","PO","SP","MFM","77241MFM C000AB","","SOZAI","MFM新型","COWL R RR(SANDING)","1513","2026/02/09","10","77241MFMC00AB"
+"K*SP**","PO","SP","MKR","77241MKR D100AA","","SOZAI","","COWL,L REAR SIDE(SOZAI)","1513","2026/02/10","10","77241MKRD10AA"
+"K*SP**","PO","SP","MFM","77251MFM C000AB","","SOZAI","MFM新型","COWL L RR(SANDING)","1513","2026/02/06","20","77251MFMC00AB"
+"K*SP**","PO","SP","MKT","77261MKT D000AA","","SOZAI","D000AA","COWL,L REAR(SOZAI)","1513","2026/02/20","5","77261MKTD00AA"
+"K*SP**","PO","SP","MKV","77271MKV D000AA","","SOZAI","","COWL,L REAR(SOZAI)","1513","2026/02/23","5","77271MKVD00AA"
+"K*SP**","PO","SP","K88","80100K88 L201","PB186","PB186","0","FENDER,REAR","1513","2026/02/23","5","80100K88L20ZC"
+"K*SP**","PO","SP","K88","80100K88 L201","R110","R110","0","FENDER,REAR","1513","2026/02/10","5","80100K88L20ZB"
+"K*SP**","PO","SP","K88","80100K88 L201","T23","T23","0","FENDER,REAR","1513","2026/02/11","10","80100K88L20ZA"
+"K*SP**","PO","SP","MJR","80100MJR 6700AB","","SOZAI","0","FENDER B RR(SANDING)","1513","2026/02/10","5","80100MJR670AB"
+"K*SP**","PO","SP","MKE","80101K95 AJ00","R292R","R292R","0","SET ILLUS,RR FENDER","1513","2026/02/19","5","80101K95AJ0ZA"
+"K*SP**","PO","SP","MCA","80107MCA S400AB","","SOZAI","0","COVER R SADDLEBAG REAR(SANDING)","1513","2026/02/26","5","80107MCAS40AB"
+"K*SP**","PO","SP","HP1","80110HP1 60002001","NH196","NH196","0","REAR FENDER","1513","2026/02/23","10","80110HP1600ZD"
+"K*SP**","PO","SP","HP1","80110HP1 60002001","NHA79MR","NHA79MR","0","REAR FENDER","1513","2026/02/19","10","80110HP1600ZA"
+"K*SP**","PO","SP","HP1","80110HP1 60002001","NHA79MR","NHA79MR","0","REAR FENDER","1513","2026/02/20","5","80110HP1600ZA"
+"K*SP**","PO","SP","MKC","80131MKC A000AB","","SOZAI","","COVERA,LSADDLEBAGRR(SANDING)","1513","2026/02/17","10","80131MKCA00AB"
+"K*SP**","PO","SP","K88","80151K88 L201","T23","T23","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/12","5","80151K88L20ZA"
+"K*SP**","PO","SP","GJH","81100GJH J000","TYPE1","","0","SET ILLUS,RR DECK COVER","1513","2026/02/13","2","81100GJHJ00ZA"
+"K*SP**","PO","SP","MKC","81112MKC A000AB","","SOZAI","","COVER R,TRUNK SIDE(SANDING)","1513","2026/02/20","5","81112MKCA00AB"
+"K*SP**","PO","SP","MKC","81112MKC L000AB","","SOZAI","","COVER,R TRUNK SIDE(SANDING)","1513","2026/02/02","20","81112MKCL00AB"
+"K*SP**","PO","SP","MKC","81114MKC A001","","","旧型","BOX ASSY,TRUNK INNER","1513","2026/02/17","15","81114MKCA00"
+"K*SP**","PO","SP","MKC","81116MKC A000AB","","SOZAI","","COVER CENTER,TRUNKLWR(SANDING)","1513","2026/02/06","10","81116MKCA00AB"
+"K*SP**","PO","SP","MKC","81116MKC L000AB","","SOZAI","","COVER CENTER,TRUNKLWR(SANDING)","1513","2026/02/02","5","81116MKCL00AB"
+"K*SP**","PO","SP","MKC","81121MKC A000AB","","SOZAI","TL_OLD","LID,TRUNK(SANDING)","1513","2026/02/13","5","81121MKCA00AB"
+"K*SP**","PO","SP","K88","81131K88 L210","NH388R","NH388R","スタンダード・ビジネス","SHIELD,LEG(NEW)","1513","2026/02/18","50","81131K88L21ZA"
+"K*SP**","PO","SP","K88","81135K88 Y100","YR176","YR176","ビジネス","COVER,COMB AND LOCK","1513","2026/02/12","10","81135K88Y10ZB"
+"K*SP**","PO","SP","MCA","81143MCA S400AB","","SOZAI","0","COVER R LWR TRUNK(SANDING)","1513","2026/02/26","10","81143MCAS40AB"
+"K*SP**","PO","SP","MCA","81148MCA S400AB","","SOZAI","0","COVER L LWR TRUNK(SANDING)","1513","2026/02/25","25","81148MCAS40AB"
+"K*SP**","PO","SP","MKC","81212MKC A000AB","","SOZAI","","COVER,L TRUNK SIDE(SANDING)","1513","2026/02/13","5","81212MKCA00AB"
+"K*SP**","PO","SP","MKC","81212MKC L000AB","","SOZAI","","COVER,L TRUNK SIDE(SANDING)","1513","2026/02/03","20","81212MKCL00AB"
+"K*SP**","PO","SP","MCA","81221MCA S400AB","","SOZAI","0","LID,R SADDLEBAG(SANDING)","1513","2026/02/25","10","81221MCAS40AB"
+"K*SP**","PO","SP","MCA","81231MCA S400","","","0","PANEL,R SADDLEBAG","1513","2026/02/25","5","81231MCAS40"
+"K*SP**","PO","SP","MCA","81241MCA S400","","","0","INNER LID,R SADDLEBAG","1513","2026/02/26","5","81241MCAS40"
+"K*SP**","PO","SP","MKC","81311MKC A001","","","0","BODY,R SADDLEBAG","1513","2026/02/02","15","81311MKCA00"
+"K*SP**","PO","SP","MKC","81311MKC A101","","","AUDIO","BODY,R SADDLEBAG","1513","2026/02/06","5","81311MKCA10"
+"K*SP**","PO","SP","MKC","81321MKC A000AB","","SOZAI","","LID,R SADDLEBAG(SANDING)","1513","2026/02/06","20","81321MKCA00AB"
+"K*SP**","PO","SP","MKC","81331MKC A000","","","0","PANEL,R SADDLEBAG","1513","2026/02/09","15","81331MKCA00"
+"K*SP**","PO","SP","MKC","81331MKC A000","","","0","PANEL,R SADDLEBAG","1513","2026/02/10","5","81331MKCA00"
+"K*SP**","PO","SP","MKC","81341MKC A001","","","0","INNER LID,R SADDLEBAG","1513","2026/02/12","10","81341MKCA00"
+"K*SP**","PO","SP","MJN","81360MJN A002","","NH1","0","LID,L SADDLEBAG","1513","2026/02/11","10","81360MJNA00"
+"K*SP**","PO","SP","MKC","81411MKC A001","","","0","BODY,L SADDLEBAG","1513","2026/02/04","15","81411MKCA00"
+"K*SP**","PO","SP","MKC","81411MKC A001","","","0","BODY,L SADDLEBAG","1513","2026/02/05","15","81411MKCA00"
+"K*SP**","PO","SP","MKC","81411MKC A101","","","0","BODY,L SADDLEBAG","1513","2026/02/09","10","81411MKCA10"
+"K*SP**","PO","SP","MCA","81421MCA S400AB","","SOZAI","0","LID,L SADDLEBAG(SANDING)","1513","2026/02/26","10","81421MCAS40AB"
+"K*SP**","PO","SP","MKC","81421MKC A000AB","","SOZAI","0","LID,L SADDLEBAG(SANDING)","1513","2026/02/05","15","81421MKCA00AB"
+"K*SP**","PO","SP","MKC","81431MKC A001","","","0","PANEL,L SADDLEBAG","1513","2026/02/11","15","81431MKCA00"
+"K*SP**","PO","SP","MKC","81431MKC A001","","","0","PANEL,L SADDLEBAG","1513","2026/02/12","10","81431MKCA00"
+"K*SP**","PO","SP","MKC","81441MKC A001","","","0","INNER LID,L SADDLEBAG","1513","2026/02/10","15","81441MKCA00"
+"K*SP**","PO","SP","MCA","81501MCA S400AB","","SOZAI","0","COWL CTR RR SADDLEBAG(SANDING)","1513","2026/02/26","5","81501MCAS40AB"
+"K*SP**","PO","SP","MKC","81550MKC A100AB","","SOZAI","","COVER,CTR RR TOP(SANDING)","1513","2026/02/13","5","81550MKCA10AB"
+"K*SP**","PO","SP","MKC","81551MKC A100AA","","SOZAI","","LID R,RR TOP(SOZAI)","1513","2026/02/12","10","81551MKCA10AA"
+"K*SP**","PO","SP","MKC","81556MKC A100AA","","SOZAI","","LID L,RR TOP(SOZAI)","1513","2026/02/16","5","81556MKCA10AA"
+"K*SP**","PO","SP","MCA","82513MCA S400","","NH1","0","COVER,L SADDLEBAG LID","1513","2026/02/20","5","82513MCAS40"
+"K*SP**","PO","SP","MKR","83152MKR D100AB","","SOZAI","","SHELTER,FR(SANDING)","1513","2026/02/10","5","83152MKRD10AB"
+"K*SP**","PO","SP","MKR","83162MKR D100AA","","SOZAI","","COVER,R SIDE(SOZAI)","1513","2026/02/10","5","83162MKRD10AA"
+"K*SP**","PO","SP","MKR","83172MKR D100AA","","SOZAI","","COVER,L SIDE(SOZAI)","1513","2026/02/11","5","83172MKRD10AA"
+"K*SP**","PO","SP","K88","83404K88 L001","NH388R","NH388R","0","LID,R BODY COVER","1513","2026/02/18","5","83404K88L00ZA"
+"K*SP**","PO","SP","K88","83404K88 L201","NH1","NH1","0","LID,R BODY COVER","1513","2026/02/19","10","83404K88L20ZD"
+"K*SP**","PO","SP","K88","83410K88 B000","TYPE2","NH1","0","SET ILLUS,R BODY COVER LID","1513","2026/02/04","5","83410K88B00ZB"
+"K*SP**","PO","SP","K88","83410K88 B000","TYPE3","NH1","0","SET ILLUS,R BODY COVER LID","1513","2026/02/09","10","83410K88B00ZA"
+"K*SP**","PO","SP","K88","83504K88 L001","NH388R","NH388R","0","LID,L BODY COVER","1513","2026/02/12","25","83504K88L00ZA"
+"K*SP**","PO","SP","K88","83504K88 L201","NH1","NH1","0","LID,L BODY COVER","1513","2026/02/02","15","83504K88L20ZD"
+"K*SP**","PO","SP","K88","83504K88 L201","R110","R110","0","LID,L BODY COVER","1513","2026/02/16","20","83504K88L20ZB"
+"K*SP**","PO","SP","K88","83504K88 L201","R110","R110","0","LID,L BODY COVER","1513","2026/02/17","20","83504K88L20ZB"
+"K*SP**","PO","SP","K88","83510GGN B000 01","TYPE1","NH1","0","SET ILLUS,L BODY COVER LID","1513","2026/02/05","5","83510GGNB00ZA"
+"K*SP**","PO","SP","GGZ","83510GGZ J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/11","5","83510GGZJ00AA"
+"K*SP**","PO","SP","GJA","83510GJA J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/11","50","83510GJAJ00AA"
+"K*SP**","PO","SP","GJA","83510GJA J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/12","15","83510GJAJ00AA"
+"K*SP**","PO","SP","GJB","83510GJB J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/19","5","83510GJBJ00AA"
+"K*SP**","PO","SP","GJB","83510GJB J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/20","50","83510GJBJ00AA"
+"K*SP**","PO","SP","GJB","83510GJB J000AA","","SOZAI","0","COVER,R BODY(SOZAI)","1513","2026/02/23","50","83510GJBJ00AA"
+"K*SP**","PO","SP","K88","83510K88 B000","TYPE3","NH1","0","SET ILLUS,L BODY COVER LID","1513","2026/02/10","5","83510K88B00ZA"
+"K*SP**","PO","SP","MLC","83510MLC D000AB","","SOZAI","","COVER,A R SIDE(SANDING)","1513","2026/02/06","5","83510MLCD00AB"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/10","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/11","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/12","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/13","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/16","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/17","50","83520GJBJ00AA"
+"K*SP**","PO","SP","GJB","83520GJB J000AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/18","40","83520GJBJ00AA"
+"K*SP**","PO","SP","GGZ","83521GGZ J001AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/11","5","83521GGZJ00AA"
+"K*SP**","PO","SP","MKW","83521MKW D000AB","","SOZAI","","SHELTER,R SIDE(SANDING)","1513","2026/02/04","5","83521MKWD00AB"
+"K*SP**","PO","SP","MFM","83600MFM C000AB","","SOZAI","0","COVER R SIDE(SANDING)","1513","2026/02/13","5","83600MFMC00AB"
+"K*SP**","PO","SP","K88","83601K88 L210","T23","T23","0","COVER,R BODY","1513","2026/02/16","10","83601K88L21ZA"
+"K*SP**","PO","SP","GJA","83610GJA J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/13","50","83610GJAJ00AA"
+"K*SP**","PO","SP","GJA","83610GJA J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/16","10","83610GJAJ00AA"
+"K*SP**","PO","SP","GJB","83610GJB J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/24","10","83610GJBJ00AA"
+"K*SP**","PO","SP","GJB","83610GJB J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/25","50","83610GJBJ00AA"
+"K*SP**","PO","SP","GJB","83610GJB J000AA","","SOZAI","0","COVER L BODY(SOZAI)","1513","2026/02/26","50","83610GJBJ00AA"
+"K*SP**","PO","SP","MJP","83611MJP G501AA","","SOZAI","0","COVER,R SIDE(SOZAI)","1513","2026/02/03","15","83611MJPG50AA"
+"K*SP**","PO","SP","MKC","83611MKC A000AB","","SOZAI","","COVER A,R SIDE(SANDING)","1513","2026/02/03","5","83611MKCA00AB"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/18","19","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/19","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/20","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/23","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/24","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/25","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GJB","83620GJB J000AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/26","50","83620GJBJ00AA"
+"K*SP**","PO","SP","GGZ","83621GGZ J001AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/11","5","83621GGZJ00AA"
+"K*SP**","PO","SP","MFT","83661MFT 6400AA","","SOZAI","0","COVER L RR BODY LOWER(SOZAI)","1513","2026/02/23","5","83661MFT640AA"
+"K*SP**","PO","SP","MJP","83711MJP G501AA","","SOZAI","0","COVER,L SIDE(SOZAI)","1513","2026/02/04","10","83711MJPG50AA"
+"K*SP**","PO","SP","MKC","83711MKC A000AB","","SOZAI","","COVER A,L SIDE(SANDING)","1513","2026/02/05","5","83711MKCA00AB"
+"K*SP**","PO","SP","MKS2","83711MKS E201AA","","SOZAI","","COWL L,RR SIDE(SOZAI)","1513","2026/02/18","5","83711MKSE20AA"
+"K*SP**","PO","SP","MLF","83711MLF E000AB","","SOZAI","","COWL A,L RR SIDE(SANDING)","1513","2026/02/24","5","83711MLFE00AB"
+"K*SP**","PO","SP","GJB","83712GJB J000AA","","SOZAI","0","COVER,RR CENTER(SOZAI)","1513","2026/02/24","10","83712GJBJ00AA"
+"K*SP**","PO","SP","MKN","17570MKY D600 03","NHA86M","NHA86M","0","COVER ASSY,FUEL TANK FR","1513","2026/02/03","5","17570MKYD60ZG"
+"K*SP**","PO","SP","K88","53206K88 J001","NH388","NH388","スタンダード","COVER,HANDLE LOW","1513","2026/02/20","5","53206K88J00ZD"
+"K*SP**","PO","SP","K88","53206K88 J001","PB394M","PB394M","スタンダード","COVER,HANDLE LOW","1513","2026/02/06","5","53206K88J00ZC"
+"K*SP**","PO","SP","K88","53206K88 J001","YR176","YR176","スタンダード","COVER,HANDLE LOW","1513","2026/02/25","5","53206K88J00ZH"
+"K*SP**","PO","SP","K64","61000K64 JH00 03","TYPE3","R380","23YM","SET ILLUS,FR FENDER","1513","2026/02/25","5","61000K64JH0ZA"
+"K*SP**","PO","SP","K88","61100K88 J001","B197M","B197M","スタンダード","FENDER,FRONT","1513","2026/02/03","15","61100K88J00ZG"
+"K*SP**","PO","SP","K88","61100K88 J001","G142M","G142M","スタンダード","FENDER,FRONT","1513","2026/02/02","15","61100K88J00ZF"
+"K*SP**","PO","SP","K88","61100K88 J001","NH388","NH388","スタンダード","FENDER,FRONT","1513","2026/02/20","10","61100K88J00ZD"
+"K*SP**","PO","SP","K88","61100K88 J001","PB394M","PB394M","スタンダード","FENDER,FRONT","1513","2026/02/06","15","61100K88J00ZC"
+"K*SP**","PO","SP","K88","61100K88 J001","R201","R201","スタンダード","FENDER,FRONT","1513","2026/02/13","5","61100K88J00ZJ"
+"K*SP**","PO","SP","K88","61100K88 J001","YR211","YR211","スタンダード","FENDER,FRONT","1513","2026/02/18","5","61100K88J00ZB"
+"K*SP**","PO","SP","MFJ","61100MFJ D001 06","NHA86M","NHA86M","0","FENDER,FR COMP","1513","2026/02/02","10","61100MFJD00ZV"
+"K*SP**","PO","SP","MKN","61101MKN D500 06","NHD19M","NHD19M","0","FENDER,COMP FRONT","1513","2026/02/13","20","61101MKND50ZW"
+"K*SP**","PO","SP","MKN","61110MKY J500 03","TYPE1","R381C","0","SET ILLUS,FR FENDER","1513","2026/02/25","5","61110MKYJ50ZC"
+"K*SP**","PO","SP","MLRX","61110MLR J800 03","TYPE1","NHA86M","DQ00AA","FENDER,COMP FRONT","1513","2026/02/25","10","61110MLRJ80ZA"
+"K*SP**","PO","SP","MJC","64100MJC LS00","NHC47P","NHC47P","0","SET ILLUS,UPPER COWL","1513","2026/02/05","5","64100MJCLS0ZA"
+"K*SP**","PO","SP","MKZ","64100MKZ J300","TYPE1","R380","0","SET ILLUST,UPPER COWL","1513","2026/02/10","15","64100MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64100MKZ J300","TYPE1","R380","0","SET ILLUST,UPPER COWL","1513","2026/02/11","15","64100MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64100MKZ J400","TYPE1","NHA86M","0","SET ILLUST,UPPER COWL","1513","2026/02/19","20","64100MKZJ40ZA"
+"K*SP**","PO","SP","MKC","64100MLJ M200","TYPE1","R337M","8A+7B","SET ILLUS,GARNISH SCREEN A","1513","2026/02/17","5","64100MLJM20ZA"
+"K*SP**","PO","SP","MKC","64100MLJ M700","TYPE1","YR387M/NHC07M","8A+7A+7B","SET ILLUS,GARNISH SCREEN A","1513","2026/02/25","5","64100MLJM70ZA"
+"K*SP**","PO","SP","MKC","64105MKC A000 02","TYPE1","NHB73M","8A","GARNISH B ASSY,SCREEN","1513","2026/02/02","15","64105MKCA00ZB"
+"K*SP**","PO","SP","MKC","64105MKC A100 02","TYPE1","NHB01","7B+8A","GARNISH B ASSY,SCREEN","1513","2026/02/05","10","64105MKCA10ZA"
+"K*SP**","PO","SP","MKC","64110MKC A000","NHA86M","NHA86M","OCなし","GARNISH A,SCREEN","1513","2026/02/02","5","64110MKCA00ZH"
+"K*SP**","PO","SP","MKV","64111MKV D500 01","YR386M","YR386M","D500AA","COWL,FRONT","1513","2026/02/18","10","64111MKVD50ZA"
+"K*SP**","PO","SP","MKT","64140MKT D000 03","NHA86M","NHA86M","D000AA","COVER ASSY,INNER","1513","2026/02/09","5","64140MKTD00ZG"
+"K*SP**","PO","SP","MKT","64140MKT D000 03","NHB01","NHB01","D000AA","COVER ASSY,INNER","1513","2026/02/09","35","64140MKTD00ZD"
+"K*SP**","PO","SP","MKT","64140MKT D000 03","R380","R380","D000AA","COVER ASSY,INNER","1513","2026/02/23","10","64140MKTD00ZA"
+"K*SP**","PO","SP","MKW","64151MKW D000","NHC08M","NHC08M","0","PANEL,R AIR","1513","2026/02/24","25","64151MKWD00ZA"
+"K*SP**","PO","SP","MKW","64151MKW D700","NHB01","NHB01","D700AA","PANEL,R AIR","1513","2026/02/13","10","64151MKWD70ZB"
+"K*SP**","PO","SP","MKW","64161MKW D000","NHC08M","NHC08M","0","PANEL,L AIR","1513","2026/02/25","10","64161MKWD00ZA"
+"K*SP**","PO","SP","MKW","64161MKW D700","NHB01","NHB01","D700AA","PANEL,L AIR","1513","2026/02/12","10","64161MKWD70ZB"
+"K*SP**","PO","SP","MKW","64161MKW D700","NHC08M","NHC08M","D700AA","PANEL,L AIR","1513","2026/02/23","15","64161MKWD70ZA"
+"K*SP**","PO","SP","MKYJ","64210MKY JF00","R380","R380","MKY E000AA","SET ILLUS,R MID COWL A","1513","2026/02/23","1","64210MKYJF0ZA"
+"K*SP**","PO","SP","MLN1","64210MLN E000","NHA86M","NHA86M","1型","COWL,FR CENTER","1513","2026/02/23","20","64210MLNE00ZC"
+"K*SP**","PO","SP","MLT","64211MLT D000","NHB01","NHB01","","COWL,FR UPPER","1513","2026/02/18","5","64211MLTD00ZC"
+"K*SP**","PO","SP","MLT","64211MLT D000","R380","R380","","COWL,FR UPPER","1513","2026/02/17","5","64211MLTD00ZA"
+"K*SP**","PO","SP","MLL","64212MLL D001","NHA86M","NHA86M","","COWL,R UPPER H/L","1513","2026/02/02","10","64212MLLD00ZE"
+"K*SP**","PO","SP","MLL","64212MLL D001","R380","R380","","COWL,R UPPER H/L","1513","2026/02/16","10","64212MLLD00ZA"
+"K*SP**","PO","SP","MFP","64220MFP JV00 01","TYPE1 1","NHA66P/R381C","8A+7A+8B+7B","SET ILLUS,R SIDE COWL","1513","2026/02/03","5","64220MFPJV0ZB"
+"K*SP**","PO","SP","MFP","64220MFP SB00 01","TYPE1 1","PB409P/NHB53P","ミラー2TN035 8A+7A+7B","SET ILLUS,R SIDE COWL","1513","2026/02/10","5","64220MFPSB0ZB"
+"K*SP**","PO","SP","MLRX","64220MLR J900","NHB53P","NHB53P","D800AA","COWL ASSY,R MIDDLE","1513","2026/02/13","4","64220MLRJ90ZA"
+"K*SP**","PO","SP","MKT","64222MKT D700","NHD05","NHD05","D700AA","COWL,NOSE","1513","2026/02/25","10","64222MKTD70ZC"
+"K*SP**","PO","SP","MKT","64222MKT D700","PB409P","PB409P","D700AA","COWL,NOSE","1513","2026/02/10","5","64222MKTD70ZD"
+"K*SP**","PO","SP","MFP","64230MFP SB00 01","TYPE1 1","PB409P/NHB53P","ミラー2TN035 8A+7A+7B","SET ILLUS,L SIDE COWL","1513","2026/02/11","5","64230MFPSB0ZB"
+"K*SP**","PO","SP","MLRX","64240MLR J900","NHB53P","NHB53P","D800AA","COWL ASSY,L MIDDLE","1513","2026/02/16","30","64240MLRJ90ZA"
+"K*SP**","PO","SP","MLRX","64240MLR Y800","R134","R134","D800AA","COWL ASSY,L MIDDLE","1513","2026/02/23","5","64240MLRY80ZA"
+"K*SP**","PO","SP","MLF","64241MLF E800","YR386M","YR386M","一発クリア","COWL,FR CENTER","1513","2026/02/17","5","64241MLFE80ZA"
+"K*SP**","PO","SP","MLRR","64251MLR D000","NHA86M","NHA86M","D000AA","COWL,R MIDDLE","1513","2026/02/25","5","64251MLRD00ZC"
+"K*SP**","PO","SP","MKS2","64252MKS E200 04","TYPE1","NHA86M","2型 8A","COVER ASSY,FRONT LOWER","1513","2026/02/06","10","64252MKSE20ZB"
+"K*SP**","PO","SP","MKS2","64252MKS E200 04","TYPE2","NHB53P","2型 7B+8A","COVER ASSY,FRONT LOWER","1513","2026/02/20","15","64252MKSE20ZA"
+"K*SP**","PO","SP","MKS1","64255MKS E000","TYPE1","NHA86M","1型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/05","10","64255MKSE00ZA"
+"K*SP**","PO","SP","MKS2","64255MKS E200 01","TYPE2","B197M","2型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/03","15","64255MKSE20ZA"
+"K*SP**","PO","SP","MKS1","64255MLG E500","TYPE1","B197M","1型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/04","5","64255MLGE50ZA"
+"K*SP**","PO","SP","MLN1","64255MLN E200","TYPE1","NHB01","1型 8A+7B","SET ILLUS,FR CENTER COWL","1513","2026/02/18","15","64255MLNE20ZC"
+"K*SP**","PO","SP","MLN4","64255MLN ER00","NHB01","NHB01","MKS2型 8A","SET ILLUS,FR CENTER COWL","1513","2026/02/16","10","64255MLNER0ZA"
+"K*SP**","PO","SP","MLN4","64255MLN ES00 01","TYPE1","NHB53P","MKS2型 7B","SET ILLUS,FR CENTER COWL","1513","2026/02/19","10","64255MLNES0ZA"
+"K*SP**","PO","SP","MKS1","64260MKS E000 01","TYPE1","NHA86M","1型 7B","SET ILLUS,R FR SIDE COWL","1513","2026/02/05","10","64260MKSE00ZB"
+"K*SP**","PO","SP","MKS1","64260MKS E000 01","TYPE2","R380","1型 7B","SET ILLUS,R FR SIDE COWL","1513","2026/02/23","10","64260MKSE00ZA"
+"K*SP**","PO","SP","MKS1","64265MKS E000 01","TYPE1","NHA86M","1型 7B","SET ILLUS,L FR SIDE COWL","1513","2026/02/06","5","64265MKSE00ZB"
+"K*SP**","PO","SP","MKS1","64265MKS E000 01","TYPE2","R380","1型 7B","SET ILLUS,L FR SIDE COWL","1513","2026/02/24","20","64265MKSE00ZA"
+"K*SP**","PO","SP","MKS1","64265MLG E400","NHB53P","NHB53P","1型 8A+7B","SET ILLUS,L FR SIDE COWL","1513","2026/02/16","10","64265MLGE40ZD"
+"K*SP**","PO","SP","MLRR","64280MLR J200","R380","R380","D000AA","SET ILLUS,R WINGLET COWL","1513","2026/02/16","5","64280MLRJ20ZA"
+"K*SP**","PO","SP","K64","64300K64 JH01","TYPE2","NHB53P","23YM","SET ILLUS,R MIDDLE COWL","1513","2026/02/26","10","64300K64JH0ZA"
+"K*SP**","PO","SP","MJC","64300MJC LS00 01","NHC47P","NHC47P","0","SET ILLUS,R MIDDLE COWL","1513","2026/02/05","10","64300MJCLS0ZA"
+"K*SP**","PO","SP","MKT","64300MKT D700","NHB53P","NHB53P","D700AA","COWL ASSY,R RR SIDE","1513","2026/02/17","5","64300MKTD70ZA"
+"K*SP**","PO","SP","MKT","64300MKT D700","NHD05","NHD05","D700AA","COWL ASSY,R RR SIDE","1513","2026/02/25","5","64300MKTD70ZC"
+"K*SP**","PO","SP","MLB","64300MLB D200","TYPE1","NHB54P","0","SET ILLUS,R SHROUD A","1513","2026/02/02","5","64300MLBD20ZD"
+"K*SP**","PO","SP","MLB","64300MLB D200","TYPE2","B197M","0","SET ILLUS,R SHROUD A","1513","2026/02/04","5","64300MLBD20ZC"
+"K*SP**","PO","SP","MLB","64300MLB D200","TYPE4","NHA86M","0","SET ILLUS,R SHROUD A","1513","2026/02/25","15","64300MLBD20ZA"
+"K*SP**","PO","SP","MLB","64300MLB G400","TYPE1","NHB54P","0","SET ILLUS,R SHROUD A","1513","2026/02/04","5","64300MLBG40ZC"
+"K*SP**","PO","SP","MKC","64300MLJ M500 01","NHA86M","NHA86M","8A+8B","COWL ASSY,R MIDDLE","1513","2026/02/03","5","64300MLJM50ZA"
+"K*SP**","PO","SP","MLRR","64300MLR J200","R380","R380","D000AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/16","5","64300MLRJ20ZA"
+"K*SP**","PO","SP","MKC","64305MLJ AY00","TYPE1","NH389M","8A+8B","COWL ASSY,L MIDDLE","1513","2026/02/27","5","64305MLJAY0ZA"
+"K*SP**","PO","SP","MKA2","64310MJL D701","NH436M","NH436M","新型","COWL,R FRONT SIDE","1513","2026/02/26","5","64310MJLD70ZF"
+"K*SP**","PO","SP","MKT","64310MKT D600","TYPE2","R380","D000AA 旧型","SET ILLUS,R SIDE COWL","1513","2026/02/23","5","64310MKTD60ZA"
+"K*SP**","PO","SP","MKT","64310MKT D800","Y242","Y242","D700AA","SET ILLUS,R SIDE COWL","1513","2026/02/06","10","64310MKTD80ZA"
+"K*SP**","PO","SP","MLF","64310MLF E800","NHC52MC","NHC52MC","8A E800AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/16","5","64310MLFE80ZC"
+"K*SP**","PO","SP","MLF","64310MLF E800","PB409PC","PB409PC","8A E800AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/27","5","64310MLFE80ZB"
+"K*SP**","PO","SP","MKS1","64310MLG E500","TYPE1","NHB53P","1型 8A+7B","SET ILLUS,R MIDDLE COWL","1513","2026/02/13","5","64310MLGE50ZA"
+"K*SP**","PO","SP","MLL","64310MLL D000","NHB01","NHB01","8A","SET ILLUS,R SHROUD A","1513","2026/02/16","5","64310MLLD00ZA"
+"K*SP**","PO","SP","MLL","64310MLL W100","NHB01","NHB01","8A","SET ILLUS,R SHROUD A","1513","2026/02/18","13","64310MLLW10ZA"
+"K*SP**","PO","SP","MLN1","64310MLN E100","NHA86M","NHA86M","1型 8A","SET ILLUS,R MIDDLE COWL","1513","2026/02/23","5","64310MLNE10ZA"
+"K*SP**","PO","SP","MLN1","64310MLN E200","R380","R380","1型 8A+7B","SET ILLUS,R MIDDLE COWL","1513","2026/02/16","10","64310MLNE20ZA"
+"K*SP**","PO","SP","MLN1","64310MLN E500 01","NHB53P","NHB53P","1型 8A+7B","SET ILLUS,R MIDDLE COWL","1513","2026/02/20","15","64310MLNE50ZA"
+"K*SP**","PO","SP","MKT","64311MKT D000","NHA86M","NHA86M","D000AA 旧型","COWL,R SIDE","1513","2026/02/09","15","64311MKTD00ZG"
+"K*SP**","PO","SP","MKT","64311MKT D000","NHC64M","NHC64M","D000AA 旧型","COWL,R SIDE","1513","2026/02/04","5","64311MKTD00ZF"
+"K*SP**","PO","SP","MKT","64311MKT D700","NHB01","NHB01","D700AA","COWL,R SIDE","1513","2026/02/09","20","64311MKTD70ZB"
+"K*SP**","PO","SP","MKT","64311MKT D700","NHB53P","NHB53P","D700AA","COWL,R SIDE","1513","2026/02/17","10","64311MKTD70ZA"
+"K*SP**","PO","SP","MKV","64311MKV D500 01","NHC65M","NHC65M","D500AA","COWL,R FRONT SIDE A","1513","2026/02/12","5","64311MKVD50ZB"
+"K*SP**","PO","SP","MKT","64315MKT D700","NHB53P","NHB53P","D700AA","LID COMP,POCKET","1513","2026/02/18","5","64315MKTD70ZA"
+"K*SP**","PO","SP","MKT","64315MKT DB00","NHB54P","NHB54P","D700AA ストライプ有り","LID COMP,POCKET","1513","2026/02/05","10","64315MKTDB0ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J300 02","R380","R380","0","COWL ASSY,R MIDDLE","1513","2026/02/10","15","64315MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J300 02","R380","R380","0","COWL ASSY,R MIDDLE","1513","2026/02/11","10","64315MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J400 02","NHA86M","NHA86M","0","COWL ASSY,R MIDDLE","1513","2026/02/20","15","64315MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64315MKZ J400 02","NHA86M","NHA86M","0","COWL ASSY,R MIDDLE","1513","2026/02/23","15","64315MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64320MKZ J300","PB440M","PB440M","0","SET ILLUS,R WINGLET","1513","2026/02/18","30","64320MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64320MKZ J400","NHA86M","NHA86M","0","SET ILLUS,R WINGLET","1513","2026/02/20","15","64320MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64320MKZ J400","NHA86M","NHA86M","0","SET ILLUS,R WINGLET","1513","2026/02/23","20","64320MKZJ40ZA"
+"K*SP**","PO","SP","MLRX","64320MLR Y800","TYPE1","NHA86M","D800AA","SET ILLUS,R FR SIDE COWL","1513","2026/02/25","10","64320MLRY80ZA"
+"K*SP**","PO","SP","MLM","64321MLM E000","NH389M","NH389M","0","COVER,R UNDER","1513","2026/02/24","15","64321MLME00ZA"
+"K*SP**","PO","SP","MLM","64321MLM E000","NH389M","NH389M","0","COVER,R UNDER","1513","2026/02/25","20","64321MLME00ZA"
+"K*SP**","PO","SP","MLM","64321MLM E000","NHD28M","NHD28M","0","COVER,R UNDER","1513","2026/02/02","15","64321MLME00ZB"
+"K*SP**","PO","SP","MLM","64321MLM E000","NHD28M","NHD28M","0","COVER,R UNDER","1513","2026/02/03","20","64321MLME00ZB"
+"K*SP**","PO","SP","MKW","64330MKW D000","TYPE3","R380","0","SET ILLUS,R MIDDLE COWL A","1513","2026/02/23","10","64330MKWD00ZB"
+"K*SP**","PO","SP","MKW","64330MKW D700","TYPE3","NHD05","D700AA","SET ILLUS,R MIDDLE COWL","1513","2026/02/25","5","64330MKWD70ZA"
+"K*SP**","PO","SP","MLM","64331MLM E000","NH389M","NH389M","0","COVER,L UNDER","1513","2026/02/26","20","64331MLME00ZA"
+"K*SP**","PO","SP","MLM","64331MLM E000","NH389M","NH389M","0","COVER,L UNDER","1513","2026/02/27","20","64331MLME00ZA"
+"K*SP**","PO","SP","MLM","64331MLM E000","NHD28M","NHD28M","0","COVER,L UNDER","1513","2026/02/04","20","64331MLME00ZB"
+"K*SP**","PO","SP","MLM","64331MLM E000","NHD28M","NHD28M","0","COVER,L UNDER","1513","2026/02/05","20","64331MLME00ZB"
+"K*SP**","PO","SP","MLT","64335MLT D000","TYPE2","NHC47P","8A+8B","COVER ASSY,R FUEL TANK","1513","2026/02/09","5","64335MLTD00ZA"
+"K*SP**","PO","SP","MLT","64335MLT D100","R380","R380","8A+7B+8B","COVER ASSY,R FUEL TANK","1513","2026/02/16","10","64335MLTD10ZB"
+"K*SP**","PO","SP","K64","64340K64 J002","NH436M","NH436M","旧型","COVER,R FRONT SIDE","1513","2026/02/26","10","64340K64J00ZA"
+"K*SP**","PO","SP","MKW","64340MKW D000","TYPE1","NHA86M","0","SET ILLUS,L MIDDLE COWL A","1513","2026/02/17","10","64340MKWD00ZD"
+"K*SP**","PO","SP","MKW","64340MKW D000","TYPE3","R380","0","SET ILLUS,L MIDDLE COWL A","1513","2026/02/24","10","64340MKWD00ZB"
+"K*SP**","PO","SP","MKW","64340MKW D000","TYPE4","B197M","0","SET ILLUS,L MIDDLE COWL A","1513","2026/02/03","10","64340MKWD00ZA"
+"K*SP**","PO","SP","MKW","64340MKW D700","TYPE1","R134","D700AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/23","5","64340MKWD70ZC"
+"K*SP**","PO","SP","MKW","64340MKW D700","TYPE2","NHB54P","D700AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/03","15","64340MKWD70ZB"
+"K*SP**","PO","SP","MLRX","64340MLR Y800","TYPE1","NHA86M","D800AA","SET ILLUS,L FR SIDE COWL","1513","2026/02/26","15","64340MLRY80ZA"
+"K*SP**","PO","SP","MJC","64350MJC LS00 01","NHC47P","NHC47P","8A","SET ILLUS,L MIDDLE COWL","1513","2026/02/06","5","64350MJCLS0ZA"
+"K*SP**","PO","SP","MKT","64350MKT D700","NHB01","NHB01","D700AA","COWL ASSY,L RR SIDE","1513","2026/02/10","10","64350MKTD70ZB"
+"K*SP**","PO","SP","MKT","64350MKT D700","NHB53P","NHB53P","D700AA","COWL ASSY,L RR SIDE","1513","2026/02/18","5","64350MKTD70ZA"
+"K*SP**","PO","SP","MKT","64350MKT D700","NHD05","NHD05","D700AA","COWL ASSY,L RR SIDE","1513","2026/02/26","5","64350MKTD70ZC"
+"K*SP**","PO","SP","MKW","64351MKW D000","NHB01","NHB01","0","COWL B,R MIDDLE","1513","2026/02/13","5","64351MKWD00ZC"
+"K*SP**","PO","SP","MKW","64351MKW D000","NHC08M","NHC08M","0","COWL B,R MIDDLE","1513","2026/02/26","15","64351MKWD00ZA"
+"K*SP**","PO","SP","MKT","64360MKT D800","Y242","Y242","D700AA","SET ILLUS,L SIDE COWL","1513","2026/02/09","15","64360MKTD80ZA"
+"K*SP**","PO","SP","MLN1","64360MLN E100","NHA86M","NHA86M","1型 8A","SET ILLUS,L MIDDLE COWL","1513","2026/02/24","5","64360MLNE10ZA"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHA86M","NHA86M","D000AA 旧型","COWL,L SIDE","1513","2026/02/10","10","64361MKTD00ZG"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHB01","NHB01","D000AA 旧型","COWL,L SIDE","1513","2026/02/04","5","64361MKTD00ZD"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHC08M","NHC08M","D000AA 旧型","COWL,L SIDE","1513","2026/02/23","10","64361MKTD00ZC"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHC47P","NHC47P","D000AA 旧型","COWL,L SIDE","1513","2026/02/06","5","64361MKTD00ZB"
+"K*SP**","PO","SP","MKT","64361MKT D000","NHC64M","NHC64M","D000AA 旧型","COWL,L SIDE","1513","2026/02/05","10","64361MKTD00ZF"
+"K*SP**","PO","SP","MKT","64361MKT D000","R380","R380","D000AA 旧型","COWL,L SIDE","1513","2026/02/24","5","64361MKTD00ZA"
+"K*SP**","PO","SP","MKT","64361MKT D700","NHB01","NHB01","D700AA","COWL,L SIDE","1513","2026/02/10","10","64361MKTD70ZB"
+"K*SP**","PO","SP","MKT","64361MKT D700","NHB53P","NHB53P","D700AA","COWL,L SIDE","1513","2026/02/18","5","64361MKTD70ZA"
+"K*SP**","PO","SP","MKV","64361MKV D500 01","NHA86M","NHA86M","D500AA","COWL,L FRONT SIDE A","1513","2026/02/18","15","64361MKVD50ZC"
+"K*SP**","PO","SP","MKV","64361MKV D500 01","YR386M","YR386M","D500AA","COWL,L FRONT SIDE A","1513","2026/02/18","5","64361MKVD50ZA"
+"K*SP**","PO","SP","MKW","64361MKW D000","NHB01","NHB01","0","COWL B,L MIDDLE","1513","2026/02/12","10","64361MKWD00ZC"
+"K*SP**","PO","SP","MKW","64361MKW D000","NHC08M","NHC08M","0","COWL B,L MIDDLE","1513","2026/02/27","15","64361MKWD00ZA"
+"K*SP**","PO","SP","MKZ","64365MKZ J300 01","R380","R380","0","COWL ASSY,L MIDDLE","1513","2026/02/12","20","64365MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64365MKZ J300 01","R380","R380","0","COWL ASSY,L MIDDLE","1513","2026/02/13","20","64365MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64365MKZ J400 01","NHA86M","NHA86M","0","COWL ASSY,L MIDDLE","1513","2026/02/24","10","64365MKZJ40ZA"
+"K*SP**","PO","SP","MKZ","64370MKZ J400","NHA86M","NHA86M","0","SET ILLUS,L WINGLET","1513","2026/02/24","25","64370MKZJ40ZA"
+"K*SP**","PO","SP","MKPX","64400MKP KQ00","TYPE2","NHB53P","J800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/16","5","64400MKPKQ0ZA"
+"K*SP**","PO","SP","MKZ","64400MKZ J300","TYPE1","R380","0","SET ILLUS,R UNDER COWL","1513","2026/02/10","15","64400MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64400MKZ J300","TYPE1","R380","0","SET ILLUS,R UNDER COWL","1513","2026/02/11","15","64400MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","64400MKZ J300","TYPE2","NHA86M","0","SET ILLUS,R UNDER COWL","1513","2026/02/23","10","64400MKZJ30ZB"
+"K*SP**","PO","SP","MLB","64400MLB D200","TYPE1","NHB54P","0","SET ILLUS,L SHROUD A","1513","2026/02/03","15","64400MLBD20ZD"
+"K*SP**","PO","SP","MLB","64400MLB D200","TYPE4","NHA86M","0","SET ILLUS,L SHROUD A","1513","2026/02/26","10","64400MLBD20ZA"
+"K*SP**","PO","SP","MLB","64400MLB G400","TYPE1","NHB54P","0","SET ILLUS,L SHROUD A","1513","2026/02/05","5","64400MLBG40ZC"
+"K*SP**","PO","SP","MLRR","64400MLR J200","R380","R380","D000AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/17","10","64400MLRJ20ZA"
+"K*SP**","PO","SP","MLF","64410MLF E800","NHC52MC","NHC52MC","8A E800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/17","5","64410MLFE80ZC"
+"K*SP**","PO","SP","MLF","64410MLF E800","PB409PC","PB409PC","8A E800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/26","10","64410MLFE80ZB"
+"K*SP**","PO","SP","MLF","64410MLF E800","YR386M","YR386M","8A E800AA","SET ILLUS,L MIDDLE COWL","1513","2026/02/18","10","64410MLFE80ZA"
+"K*SP**","PO","SP","MLL","64410MLL D000","NHB01","NHB01","8A","SET ILLUS,L SHROUD A","1513","2026/02/17","15","64410MLLD00ZA"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHA86M","NHA86M","0","SKIRT,R FLOOR","1513","2026/02/11","15","64411MKVD00ZE"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHA86M","NHA86M","0","SKIRT,R FLOOR","1513","2026/02/12","15","64411MKVD00ZE"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHA86M","NHA86M","0","SKIRT,R FLOOR","1513","2026/02/13","10","64411MKVD00ZE"
+"K*SP**","PO","SP","MKV","64411MKV D000","NHC08M","NHC08M","0","SKIRT,R FLOOR","1513","2026/02/20","20","64411MKVD00ZC"
+"K*SP**","PO","SP","MKV","64411MKV D000","PB417M","PB417M","0","SKIRT,R FLOOR","1513","2026/02/26","20","64411MKVD00ZB"
+"K*SP**","PO","SP","MKV","64411MKV D000","R381C","R381C","0","SKIRT,R FLOOR","1513","2026/02/25","5","64411MKVD00ZA"
+"K*SP**","PO","SP","MKR","64420MKR DH00 01","TYPE2","R380","8A+7B+8B","COWL ASSY,R UNDER","1513","2026/02/25","5","64420MKRDH0ZA"
+"K*SP**","PO","SP","MKT","64421MKT D000","NHC08M","NHC08M","D000AA 旧型","COVER,R SKIRT","1513","2026/02/20","5","64421MKTD00ZA"
+"K*SP**","PO","SP","MLT","64435MLT D100 01","R380","R380","8A+7B+8B","COVER ASSY,L FUEL TANK","1513","2026/02/17","10","64435MLTD10ZB"
+"K*SP**","PO","SP","K64","64440K64 J002","NH436M","NH436M","旧型","COVER,L FRONT SIDE","1513","2026/02/27","10","64440K64J00ZA"
+"K*SP**","PO","SP","K64","64440K64 J002","R380","R380","旧型","COVER,L FRONT SIDE","1513","2026/02/26","10","64440K64J00ZB"
+"K*SP**","PO","SP","MKPX","64440MKP KQ00","NHB01","NHB01","J800AA","SET ILLUS,L SIDE COWL A","1513","2026/02/27","10","64440MKPKQ0ZA"
+"K*SP**","PO","SP","MJC","64450MJC LS00 01","NHC47P","NHC47P","8A","COWL COMP,L UNDER","1513","2026/02/06","5","64450MJCLS0ZA"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHA86M","NHA86M","0","SKIRT,L FLOOR","1513","2026/02/16","15","64461MKVD00ZE"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHA86M","NHA86M","0","SKIRT,L FLOOR","1513","2026/02/17","15","64461MKVD00ZE"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHA86M","NHA86M","0","SKIRT,L FLOOR","1513","2026/02/18","10","64461MKVD00ZE"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHB01","NHB01","0","SKIRT,L FLOOR","1513","2026/02/11","10","64461MKVD00ZD"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHB01","NHB01","0","SKIRT,L FLOOR","1513","2026/02/12","10","64461MKVD00ZD"
+"K*SP**","PO","SP","MKV","64461MKV D000","NHC08M","NHC08M","0","SKIRT,L FLOOR","1513","2026/02/23","5","64461MKVD00ZC"
+"K*SP**","PO","SP","MKV","64461MKV D000","PB417M","PB417M","0","SKIRT,L FLOOR","1513","2026/02/27","5","64461MKVD00ZB"
+"K*SP**","PO","SP","MKT","64471MKT D000","NHC64M","NHC64M","D000AA 旧型","COVER,L SKIRT","1513","2026/02/03","5","64471MKTD00ZC"
+"K*SP**","PO","SP","K64","64600K64 JK01","TYPE1","素材","86838K64 JK00 T-1黒マット","SET ILLUS,L MID INNER COWL","1513","2026/02/27","5","64600K64JK0ZA"
+"K*SP**","PO","SP","MKV","64600MKV D000","NHA86M","NHA86M","0","PANEL ASSY,R SIDE","1513","2026/02/12","5","64600MKVD00ZG"
+"K*SP**","PO","SP","MKV","64600MKV D000","PB417M","PB417M","0","PANEL ASSY,R SIDE","1513","2026/02/26","15","64600MKVD00ZB"
+"K*SP**","PO","SP","MKV","64600MKV D000","YR386M","YR386M","","PANEL ASSY,R SIDE","1513","2026/02/17","5","64600MKVD00ZH"
+"K*SP**","PO","SP","MKV","64620MKV D010 01","NHA86M","NHA86M","","COVER ASSY,R PIVOT","1513","2026/02/12","10","64620MKVD01ZD"
+"K*SP**","PO","SP","MKV","64650MKV D000","NHB01","NHB01","0","PANEL ASSY,L SIDE","1513","2026/02/11","5","64650MKVD00ZD"
+"K*SP**","PO","SP","MKV","64650MKV D000","PB417M","PB417M","0","PANEL ASSY,L SIDE","1513","2026/02/27","5","64650MKVD00ZB"
+"K*SP**","PO","SP","MKV","64670MKV D010","NHC08M","NHC08M","0","COVER ASSY,L PIVOT","1513","2026/02/23","5","64670MKVD01ZB"
+"K*SP**","PO","SP","MKZ","77210MKZ J300 01","TYPE1","R380","0","SET ILLUS,SEAT RR COWL","1513","2026/02/10","20","77210MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","77210MKZ J300 01","TYPE1","R380","0","SET ILLUS,SEAT RR COWL","1513","2026/02/11","20","77210MKZJ30ZA"
+"K*SP**","PO","SP","MKT","77211MKT D010","NHA86M","NHA86M","D000AA","COWL,R REAR","1513","2026/02/09","15","77211MKTD01ZG"
+"K*SP**","PO","SP","MKT","77211MKT D010","NHC47P","NHC47P","D000AA","COWL,R REAR","1513","2026/02/09","5","77211MKTD01ZB"
+"K*SP**","PO","SP","MKT","77211MKT D010","NHC64M","NHC64M","D000AA","COWL,R REAR","1513","2026/02/04","15","77211MKTD01ZF"
+"K*SP**","PO","SP","MFP","77220MFP JU00 03","TYPE1 2","NHA66P/R381C","8A+7A+8B+7B+8C","COWL ASSY,REAR","1513","2026/02/03","5","77220MFPJU0ZD"
+"K*SP**","PO","SP","MFP","77220MFP JU00 03","TYPE2 2","NHB01/NHC52M","8A+7A+8B+7B+8C","COWL ASSY,REAR","1513","2026/02/04","5","77220MFPJU0ZC"
+"K*SP**","PO","SP","MKR","77220MKR D100 02","TYPE2","R380","7B","SET ILLUS,SEAT CENTER COWL","1513","2026/02/23","10","77220MKRD10ZA"
+"K*SP**","PO","SP","MKV","77220MKV D500 01","TYPE2","NHA86M","D500AA","SET ILLUS,R REAR COWL","1513","2026/02/12","5","77220MKVD50ZB"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE1","NHA86M","","SET ILLUS,R REAR COWL A","1513","2026/02/25","5","77240MLBD80ZD"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE2","NHA86M","","SET ILLUS,R REAR COWL A","1513","2026/02/23","5","77240MLBD80ZC"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE3","NHC65M","","SET ILLUS,R REAR COWL A","1513","2026/02/12","5","77240MLBD80ZB"
+"K*SP**","PO","SP","MLB","77240MLB D800","TYPE4 1","NHD19M","","SET ILLUS,R REAR COWL A","1513","2026/02/13","5","77240MLBD80ZE"
+"K*SP**","PO","SP","MLB","77240MLB G400","TYPE1","NHB54P","","SET ILLUS,R REAR COWL A","1513","2026/02/04","10","77240MLBG40ZC"
+"K*SP**","PO","SP","MLV","77240MLV J100 01","NHB01","NHB01","8A+7B","SET ILLUS,R REAR COWL","1513","2026/02/16","5","77240MLVJ10ZA"
+"K*SP**","PO","SP","MLL","77241MLL D001","NHA86M","NHA86M","","COWL,R RR LOWER","1513","2026/02/02","5","77241MLLD00ZD"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE1","NHA86M","","SET ILLUS,L REAR COWL A","1513","2026/02/26","5","77250MLBD80ZD"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE2","NHA86M","","SET ILLUS,L REAR COWL A","1513","2026/02/24","5","77250MLBD80ZC"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE3","NHC65M","","SET ILLUS,L REAR COWL A","1513","2026/02/13","5","77250MLBD80ZB"
+"K*SP**","PO","SP","MLB","77250MLB D800","TYPE4 1","NHD19M","","SET ILLUS,L REAR COWL A","1513","2026/02/16","5","77250MLBD80ZE"
+"K*SP**","PO","SP","MLB","77250MLB G400","TYPE1","NHB54P","","SET ILLUS,L REAR COWL A","1513","2026/02/05","15","77250MLBG40ZC"
+"K*SP**","PO","SP","MLV","77250MLV J000 01","TYPE1 1","NHD19M","8A+7B","SET ILLUS,L REAR COWL","1513","2026/02/16","10","77250MLVJ00ZD"
+"K*SP**","PO","SP","MLV","77250MLV J100 01","NHB01","NHB01","8A+7B","SET ILLUS,L REAR COWL","1513","2026/02/17","5","77250MLVJ10ZA"
+"K*SP**","PO","SP","MLL","77251MLL D001","NHA86M","NHA86M","","COWL,L RR LOWER","1513","2026/02/03","10","77251MLLD00ZD"
+"K*SP**","PO","SP","MLL","77251MLL D001","NHB53P","NHB53P","","COWL,L RR LOWER","1513","2026/02/18","5","77251MLLD00ZC"
+"K*SP**","PO","SP","MKR","77260MKR D100","TYPE1","NHB01","7B","SET ILLUS,REAR CENTER UPPER COWL","1513","2026/02/04","5","77260MKRD10ZB"
+"K*SP**","PO","SP","MLL","77260MLL D100","NHA86M","NHA86M","8A","SET ILLUS,REAR UPPER COWL","1513","2026/02/03","10","77260MLLD10ZA"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHA86M","NHA86M","D000AA","COWL,L REAR","1513","2026/02/10","10","77261MKTD01ZG"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHB01","NHB01","D000AA","COWL,L REAR","1513","2026/02/10","5","77261MKTD01ZD"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHB53P","NHB53P","D000AA","COWL,L REAR","1513","2026/02/18","5","77261MKTD01ZK"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHC08M","NHC08M","D000AA","COWL,L REAR","1513","2026/02/23","5","77261MKTD01ZC"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHC64M","NHC64M","D000AA","COWL,L REAR","1513","2026/02/05","10","77261MKTD01ZF"
+"K*SP**","PO","SP","MKT","77261MKT D010","NHD05","NHD05","D000AA","COWL,L REAR","1513","2026/02/26","10","77261MKTD01ZH"
+"K*SP**","PO","SP","MKT","77261MKT D010","R380","R380","D000AA","COWL,L REAR","1513","2026/02/24","15","77261MKTD01ZA"
+"K*SP**","PO","SP","MKV","77270MKV D500 01","TYPE2","NHA86M","D500AA","SET ILLUS,L REAR COWL","1513","2026/02/17","5","77270MKVD50ZB"
+"K*SP**","PO","SP","MKT","77413MKT D000","NHC64M","NHC64M","D000AA","COVER,FUEL LID","1513","2026/02/04","5","77413MKTD00ZD"
+"K*SP**","PO","SP","MKT","77413MKT D000","NHD05","NHD05","D000AA","COVER,FUEL LID","1513","2026/02/25","5","77413MKTD00ZG"
+"K*SP**","PO","SP","K88","80100K88 J001","B187","B187","0","FENDER,REAR","1513","2026/02/02","10","80100K88J00ZP"
+"K*SP**","PO","SP","K88","80100K88 J001","B197M","B197M","0","FENDER,REAR","1513","2026/02/03","5","80100K88J00ZJ"
+"K*SP**","PO","SP","K88","80100K88 J001","G142M","G142M","0","FENDER,REAR","1513","2026/02/02","5","80100K88J00ZG"
+"K*SP**","PO","SP","K88","80100K88 J001","G208M","G208M","0","FENDER,REAR","1513","2026/02/27","5","80100K88J00ZU"
+"K*SP**","PO","SP","K88","80100K88 J001","NHC47P","NHC47P","0","FENDER,REAR","1513","2026/02/05","5","80100K88J00ZT"
+"K*SP**","PO","SP","K88","80100K88 J001","YR211","YR211","0","FENDER,REAR","1513","2026/02/18","5","80100K88J00ZB"
+"K*SP**","PO","SP","MKZ","80110MKZ J300","TYPE1","R380","0","SHELTER ASSY,FRONT","1513","2026/02/12","15","80110MKZJ30ZB"
+"K*SP**","PO","SP","MKZ","80110MKZ J300","TYPE1","R380","0","SHELTER ASSY,FRONT","1513","2026/02/13","15","80110MKZJ30ZB"
+"K*SP**","PO","SP","MKZ","80120MKZ J300","R380","R380","8A+7B+8B","SHELTER ASSY,RR","1513","2026/02/12","15","80120MKZJ30ZA"
+"K*SP**","PO","SP","MKZ","80120MKZ J300","R380","R380","8A+7B+8B","SHELTER ASSY,RR","1513","2026/02/13","15","80120MKZJ30ZA"
+"K*SP**","PO","SP","MKC","80122MKC A001","TYPE1","R367C","7B+8A","COVER ASSY A,R SDLBG RR","1513","2026/02/24","5","80122MKCA00ZA"
+"K*SP**","PO","SP","MKC","80122MLJ A000","TYPE2","NHC65M","7B+8A","COVER ASSY A,R SDLBG RR","1513","2026/02/12","5","80122MLJA00ZB"
+"K*SP**","PO","SP","MKC","80122MLJ A000","TYPE3","NHB01","7B+8A","COVER ASSY A,R SDLBG RR","1513","2026/02/05","20","80122MLJA00ZA"
+"K*SP**","PO","SP","MKC","80122MLJ M500","NHC33P","NHC33P","8A","COVER ASSY A,R SDLBG RR","1513","2026/02/19","5","80122MLJM50ZD"
+"K*SP**","PO","SP","MKC","80132MKC A001","TYPE1","R367C","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/25","5","80132MKCA00ZA"
+"K*SP**","PO","SP","MKC","80132MKC A001","TYPE4","NHB70M","8A","COVER ASSY A,L SDLBG RR","1513","2026/02/12","5","80132MKCA00ZD"
+"K*SP**","PO","SP","MKC","80132MLJ A000","TYPE1","R337M","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/18","15","80132MLJA00ZC"
+"K*SP**","PO","SP","MKC","80132MLJ A000","TYPE2","NHC65M","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/13","5","80132MLJA00ZB"
+"K*SP**","PO","SP","MKC","80132MLJ A000","TYPE3","NHB01","7B+8A","COVER ASSY A,L SDLBG RR","1513","2026/02/06","10","80132MLJA00ZA"
+"K*SP**","PO","SP","MKC","80132MLJ M500","NHA86M","NHA86M","8A","COVER ASSY A,L SDLBG RR","1513","2026/02/04","5","80132MLJM50ZB"
+"K*SP**","PO","SP","MKC","80132MLJ M500","NHC33P","NHC33P","8A","COVER ASSY A,L SDLBG RR","1513","2026/02/20","5","80132MLJM50ZD"
+"K*SP**","PO","SP","K88","80151K88 J001","R201","R201","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/13","5","80151K88J00ZJ"
+"K*SP**","PO","SP","K88","80151K88 J001","Y124P","Y124P","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/19","5","80151K88J00ZA"
+"K*SP**","PO","SP","K88","80151K88 J001","YR176","YR176","スタンダード・ビジネス","COVER,CENTER","1513","2026/02/25","5","80151K88J00ZH"
+"K*SP**","PO","SP","MKC","81113MKC A002","NHB70M","NHB70M","8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/10","10","81113MKCA00ZA"
+"K*SP**","PO","SP","MKC","81113MKC L001","TYPE3","NHC52M","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/12","5","81113MKCL00ZA"
+"K*SP**","PO","SP","MKC","81113MKC L301","NHC47P","NHC47P","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/02","5","81113MKCL30ZA"
+"K*SP**","PO","SP","MKC","81113MKC LG00 01","PB417M","PB417M","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/02","5","81113MKCLG0ZB"
+"K*SP**","PO","SP","MKC","81113MLJ A500","NHC64M","NHC64M","(2R-TR CVR)7B+8A","COVER ASSY,R TRUNK SIDE","1513","2026/02/02","15","81113MLJA50ZA"
+"K*SP**","PO","SP","MKC","81115MKC L300","NHC47P","NHC47P","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/02","5","81115MKCL30ZA"
+"K*SP**","PO","SP","MKC","81115MKC LG01","PB417M","PB417M","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/02","5","81115MKCLG0ZB"
+"K*SP**","PO","SP","MKC","81115MLJ A500","NHC64M","NHC64M","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/02","15","81115MLJA50ZA"
+"K*SP**","PO","SP","MKC","81115MLJ M200","TYPE1","R337M","(2CTR TR LWR)7B","SET ILLUS,COVER CTR TRUNK LWR","1513","2026/02/19","5","81115MLJM20ZA"
+"K*SP**","PO","SP","MKC","81116MKC L000","YR387MC","YR387MC","","COVER CENTER,TRUNK LWR","1513","2026/02/25","10","81116MKCL00ZR"
+"K*SP**","PO","SP","MKC","81120MLJ A200","TYPE2","NHC07M/NHC65M","(2TL)8A+7A+7B+8B(EMB)","SET ILLUS,TRUNK LID","1513","2026/02/05","5","81120MLJA20ZA"
+"K*SP**","PO","SP","MKC","81120MLJ M000","TYPE1","NHA30M","(2TL)7B+8A","SET ILLUS,TRUNK LID","1513","2026/02/06","5","81120MLJM00ZA"
+"K*SP**","PO","SP","MKC","81120MLJ M200","TYPE1","R337M","(2TL)7B+8A","SET ILLUS,TRUNK LID","1513","2026/02/19","5","81120MLJM20ZA"
+"K*SP**","PO","SP","K88","81130K88 B500","TYPE1","G208M","クロスカブ","SET ILLUS,R MAIN PIPE COVER","1513","2026/02/27","5","81130K88B50ZD"
+"K*SP**","PO","SP","K88","81140K88 B210","TYPE1","NHB01","クロスカブ くまモン","SET ILLUS,L MAIN PIPE COVER","1513","2026/02/27","5","81140K88B21ZA"
+"K*SP**","PO","SP","K88","81140K88 B500","TYPE3","PB417M","クロスカブ","SET ILLUS,L MAIN PIPE COVER","1513","2026/02/03","5","81140K88B50ZB"
+"K*SP**","PO","SP","MKC","81213MKC A002","NHB70M","NHB70M","8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/11","10","81213MKCA00ZA"
+"K*SP**","PO","SP","MKC","81213MKC L001","TYPE3","NHC52M","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/13","5","81213MKCL00ZA"
+"K*SP**","PO","SP","MKC","81213MKC L301","NHC47P","NHC47P","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/03","5","81213MKCL30ZA"
+"K*SP**","PO","SP","MKC","81213MKC LG00 01","PB417M","PB417M","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/03","5","81213MKCLG0ZB"
+"K*SP**","PO","SP","MKC","81213MLJ A500","NHC64M","NHC64M","(2L-TR CVR)7B+8A","COVER ASSY,L TRUNK SIDE","1513","2026/02/03","15","81213MLJA50ZA"
+"K*SP**","PO","SP","MKC","81213MLJ M700","YR387M","YR387M","8A+7B+8B","COVER ASSY,L TRUNK SIDE","1513","2026/02/25","5","81213MLJM70ZA"
+"K*SP**","PO","SP","MKC","81320MKC EC00 01","TYPE3","NH463M","7B+8A(EMB)","SET ILLUS,R SADDLEBAG LID","1513","2026/02/04","5","81320MKCEC0ZA"
+"K*SP**","PO","SP","MLA","81320MLA A300","NHC52M","NHC52M","","LID OUTER,R SADDLEBAG","1513","2026/02/12","10","81320MLAA30ZB"
+"K*SP**","PO","SP","MKC","81320MLJ M200","R337M","R337M","8A+7B+8B(EMB)","SET ILLUS,R SADDLEBAG LID","1513","2026/02/17","5","81320MLJM20ZA"
+"K*SP**","PO","SP","MKC","81320MLJ M500","NHA86M","NHA86M","8A","SET ILLUS,R SADDLEBAG LID","1513","2026/02/03","10","81320MLJM50ZA"
+"K*SP**","PO","SP","MKC","81320MLJ M700","YR387M","YR387M","8A+7B+8B(EMB)","SET ILLUS,R SADDLEBAG LID","1513","2026/02/24","10","81320MLJM70ZA"
+"K*SP**","PO","SP","MLA","81363MLA A301","G208M","G208M","","PANEL,R SADDLEBAG","1513","2026/02/27","5","81363MLAA30ZF"
+"K*SP**","PO","SP","MLA","81363MLA A301","NHC65M","NHC65M","","PANEL,R SADDLEBAG","1513","2026/02/12","5","81363MLAA30ZC"
+"K*SP**","PO","SP","MLA","81420MLA A300","NHC52M","NHC52M","","LID OUTER,L SADDLEBAG","1513","2026/02/13","5","81420MLAA30ZB"
+"K*SP**","PO","SP","MKC","81420MLJ M200","R337M","R337M","8A+7B+8B(EMB)","SET ILLUS,L SADDLEBAG LID","1513","2026/02/18","5","81420MLJM20ZA"
+"K*SP**","PO","SP","MKC","81420MLJ M500","NHA86M","NHA86M","8A","SET ILLUS,L SADDLEBAG LID","1513","2026/02/04","10","81420MLJM50ZA"
+"K*SP**","PO","SP","MLA","81463MLA A301","NHC52M","NHC52M","","PANEL,L SADDLEBAG","1513","2026/02/13","10","81463MLAA30ZB"
+"K*SP**","PO","SP","MLA","81463MLA A301","NHC65M","NHC65M","","PANEL,L SADDLEBAG","1513","2026/02/13","5","81463MLAA30ZC"
+"K*SP**","PO","SP","MKC","81491MLJ M500","YR387MC","YR387MC","8A","COVER ASSY,L SADDLEBAG UP","1513","2026/02/25","5","81491MLJM50ZC"
+"K*SP**","PO","SP","MKC","81520MKC A100","NH463M","NH463M","7B","SET ILLUS,RR TOP LID R","1513","2026/02/04","5","81520MKCA10ZN"
+"K*SP**","PO","SP","MKC","81520MKC A100","TYPE1","R367C","7B","SET ILLUS,RR TOP LID R","1513","2026/02/24","10","81520MKCA10ZC"
+"K*SP**","PO","SP","MKC","81520MLJ A000","NHC65M","NHC65M","7B","SET ILLUS,RR TOP LID R","1513","2026/02/05","5","81520MLJA00ZB"
+"K*SP**","PO","SP","MKC","81525MKC A100","NH463M","NH463M","7B","SET ILLUS,RR TOP LID L","1513","2026/02/05","5","81525MKCA10ZN"
+"K*SP**","PO","SP","MKC","81525MLJ A000","NHC65M","NHC65M","7B","SET ILLUS,RR TOP LID L","1513","2026/02/06","5","81525MLJA00ZB"
+"K*SP**","PO","SP","MKC","81550MKC A100","NHA86M","NHA86M","","COVER,CTR RR TOP","1513","2026/02/04","5","81550MKCA10ZK"
+"K*SP**","PO","SP","MKC","81551MKC A100","NHA86M","NHA86M","","LID R,RR TOP","1513","2026/02/03","15","81551MKCA10ZK"
+"K*SP**","PO","SP","MKC","81555MKC A100","NHA86M","NHA86M","","COVER,INNER RR TOP","1513","2026/02/04","15","81555MKCA10ZK"
+"K*SP**","PO","SP","MKC","81556MKC A100","NHA86M","NHA86M","","LID L,RR TOP","1513","2026/02/04","5","81556MKCA10ZK"
+"K*SP**","PO","SP","MKC","81570MKC A100","NHA86M","NHA86M","","COVER,END RR TOP","1513","2026/02/04","5","81570MKCA10ZK"
+"K*SP**","PO","SP","MKC","83140MLJ E100","TYPE1","NHB01","7B(E700)","SET ILLUS,L SIDE SHELTER","1513","2026/02/06","5","83140MLJE10ZC"
+"K*SP**","PO","SP","K64","83160K64 JH01","TYPE2","NHB53P","0","SET ILLUS,R TANK COVER","1513","2026/02/26","5","83160K64JH0ZA"
+"K*SP**","PO","SP","K64","83170K64 J210 01","TYPE1","NH436M","旧型","SET ILLUS,L TANK COVER","1513","2026/02/27","5","83170K64J21ZB"
+"K*SP**","PO","SP","K64","83170K64 JM00","NHB53P","NHB53P","","SET ILLUS,L TANK COVER","1513","2026/02/27","10","83170K64JM0ZA"
+"K*SP**","PO","SP","MKR","83170MKR DH00","R380","R380","8A+7B+8B","COVER ASSY,L SIDE","1513","2026/02/26","10","83170MKRDH0ZA"
+"K*SP**","PO","SP","MLM","83180MLM E000","TYPE1","NHB01","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/19","25","83180MLME00ZC"
+"K*SP**","PO","SP","MLM","83180MLM E000","TYPE2","NHC33P","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/19","25","83180MLME00ZB"
+"K*SP**","PO","SP","MLM","83180MLM E000","TYPE3","NHC47P","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/10","25","83180MLME00ZA"
+"K*SP**","PO","SP","MLM","83190MLM E000","TYPE1","NHB01","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/20","25","83190MLME00ZC"
+"K*SP**","PO","SP","MLM","83190MLM E000","TYPE2","NHC33P","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/20","25","83190MLME00ZB"
+"K*SP**","PO","SP","MLM","83190MLM E000","TYPE3","NHC47P","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/11","25","83190MLME00ZA"
+"K*SP**","PO","SP","MLM","83510MLM E000","TYPE1","NHB01","8A+7B+8B","COVER A ASSY,R SIDE","1513","2026/02/23","15","83510MLME00ZC"
+"K*SP**","PO","SP","MLM","83510MLM E000","TYPE2","NHC33P","8A+7B+8B","COVER A ASSY,R SIDE","1513","2026/02/19","15","83510MLME00ZB"
+"K*SP**","PO","SP","MLM","83510MLM E000","TYPE3 2","NHC47P","8A+7B+8B","COVER A ASSY,R SIDE","1513","2026/02/10","15","83510MLME00ZD"
+"K*SP**","PO","SP","MKW","83520MKW D000","TYPE1","NHA86M","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/19","5","83520MKWD00ZD"
+"K*SP**","PO","SP","MKW","83520MKW D000","TYPE2","NHB53P","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/17","5","83520MKWD00ZC"
+"K*SP**","PO","SP","MKW","83520MKW D000","TYPE4","B197M","7B","SET ILLUS,R SIDE SHELTER","1513","2026/02/04","5","83520MKWD00ZA"
+"K*SP**","PO","SP","MLM","83520MLM E000","TYPE1","YR396M","7B","SET ILLUS,R SIDE COVER B","1513","2026/02/06","15","83520MLME00ZC"
+"K*SP**","PO","SP","MLM","83520MLM E000","TYPE2","NHB01","7B","SET ILLUS,R SIDE COVER B","1513","2026/02/19","15","83520MLME00ZB"
+"K*SP**","PO","SP","MLM","83520MLM E000","TYPE3","NHC08M","7B","SET ILLUS,R SIDE COVER B","1513","2026/02/26","15","83520MLME00ZA"
+"K*SP**","PO","SP","K3R","83530K3R J000 02","NH389M","NH389M","","SET ILLUS,R SIDE COVER","1513","2026/02/25","5","83530K3RJ00ZE"
+"K*SP**","PO","SP","K3R","83530K3R J000 02","Y248","Y248","","SET ILLUS,R SIDE COVER","1513","2026/02/18","5","83530K3RJ00ZD"
+"K*SP**","PO","SP","MLM","83600MLM E000","TYPE1","NHB01","8A+7B","SET ILLUS,L SIDE COVER A","1513","2026/02/24","15","83600MLME00ZF"
+"K*SP**","PO","SP","MLM","83600MLM E000","TYPE2","NHC33P","8A+7B","SET ILLUS,L SIDE COVER A","1513","2026/02/20","15","83600MLME00ZE"
+"K*SP**","PO","SP","MLM","83600MLM E000","TYPE3 1","NHC47P","8A+7B","SET ILLUS,L SIDE COVER A","1513","2026/02/11","15","83600MLME00ZG"
+"K*SP**","PO","SP","MLN4","83600MLN ER00","NHC64M","NHC64M","4型 8A","COWL ASSY,R RR SIDE","1513","2026/02/06","5","83600MLNER0ZA"
+"K*SP**","PO","SP","MKS1","83610MLG E500","TYPE1","B197M","1型 8A+7B","SET ILLUS,R RR SIDE COWL A","1513","2026/02/04","5","83610MLGE50ZA"
+"K*SP**","PO","SP","MKC","83610MLJ A000","TYPE1","NHB01","7B","SET ILLUS,R SIDE COVER","1513","2026/02/05","5","83610MLJA00ZC"
+"K*SP**","PO","SP","MKC","83610MLJ AA00","TYPE2","G208M","7B","SET ILLUS,R SIDE COVER","1513","2026/02/27","5","83610MLJAA0ZA"
+"K*SP**","PO","SP","MLV","83610MLV J000","TYPE1 1","NHD19M","8A+7B","SET ILLUS,R SIDE COVER","1513","2026/02/13","5","83610MLVJ00ZD"
+"K*SP**","PO","SP","MKC","83611MKC A000","NH389M","NH389M","0","COVER A,R SIDE","1513","2026/02/24","5","83611MKCA00ZW"
+"K*SP**","PO","SP","MKC","83611MKC A000","NHA86M","NHA86M","0","COVER A,R SIDE","1513","2026/02/03","10","83611MKCA00ZH"
+"K*SP**","PO","SP","MKPX","83611MKP J800","NHB70M","NHB70M","J800AA","COVER A,L SIDE","1513","2026/02/12","5","83611MKPJ80ZD"
+"K*SP**","PO","SP","MLF","83611MLF E800","PB409PC","PB409PC","E800AA","COWL A,R RR SIDE","1513","2026/02/27","15","83611MLFE80ZB"
+"K*SP**","PO","SP","MKW","83620MKW D000","TYPE3","R380","7B","SET ILLUS,L SIDE SHELTER","1513","2026/02/24","5","83620MKWD00ZB"
+"K*SP**","PO","SP","MLM","83620MLM E000","TYPE1","YR396M","7B","SET ILLUS,L SIDE COVER B","1513","2026/02/09","15","83620MLME00ZC"
+"K*SP**","PO","SP","MLM","83620MLM E000","TYPE2","NHB01","7B","SET ILLUS,L SIDE COVER B","1513","2026/02/20","15","83620MLME00ZB"
+"K*SP**","PO","SP","MLM","83620MLM E000","TYPE3","NHC08M","7B","SET ILLUS,L SIDE COVER B","1513","2026/02/27","15","83620MLME00ZA"
+"K*SP**","PO","SP","MKW","83621MKW D700","NHB54P","NHB54P","D700AA","SHELTER,L SIDE","1513","2026/02/05","5","83621MKWD70ZC"
+"K*SP**","PO","SP","K3R","83630K3R J000 02","NH389M","NH389M","カット","SET ILLUS,L SIDE COVER","1513","2026/02/26","5","83630K3RJ00ZE"
+"K*SP**","PO","SP","K3R","83630K3R J000 02","Y248","Y248","カット","SET ILLUS,L SIDE COVER","1513","2026/02/19","5","83630K3RJ00ZD"
+"K*SP**","PO","SP","K64","83635K64 JH01","TYPE1","NHB01","23YM","SET ILLUS,L REAR COWL","1513","2026/02/27","20","83635K64JH0ZB"
+"K*SP**","PO","SP","K64","83650K64 NP00","NH389M","NH389M","25YM","COVER,SEAT LOCK","1513","2026/02/27","3","83650K64NP0ZF"
+"K*SP**","PO","SP","MKS1","83650MKS E000 04","TYPE1","NHA86M","1型 7B","SET ILLUS,R RR SIDE COWL C","1513","2026/02/05","10","83650MKSE00ZA"
+"K*SP**","PO","SP","MJC","83701MJC A000","R380","R380","0","COVER,L SIDE","1513","2026/02/26","5","83701MJCA00ZD"
+"K*SP**","PO","SP","MKC","83710MLJ M200","TYPE1","R337M","7B","SET ILLUS,L SIDE COVER","1513","2026/02/18","5","83710MLJM20ZA"
+"K*SP**","PO","SP","MKC","83711MKC A000","NH389M","NH389M","0","COVER A,L SIDE","1513","2026/02/26","5","83711MKCA00ZW"
+"K*SP**","PO","SP","MKC","83711MKC A000","YR387MC","YR387MC","0","COVER A,L SIDE","1513","2026/02/25","5","83711MKCA00ZV"
+"K*SP**","PO","SP","GJB","83712GJB J000","NHC08M","NHC08M","0","COVER,RR CENTER","1513","2026/02/20","10","83712GJBJ00YB"
+"K*SP**","PO","SP","GX1","83712GJB J000","R134","R134","0","COVER,RR CENTER","1513","2026/02/23","5","83712GJBJ00ZT"
+"K*SP**","PO","SP","MKS1","83750MKS E000 04","TYPE1","NHA86M","1型 7B","SET ILLUS,L RR SIDE COWL C","1513","2026/02/06","5","83750MKSE00ZA"
+"K*SP**","PO","SP","MKC","88130MLJ M000 01","YR387MC","YR387MC","(ミネベア素材)","COVER,R MIRROR","1513","2026/02/24","15","88130MLJM00ZE"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE1","R367C","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/24","5","88135MKCA00ZE"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE2","NHB53P","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/13","5","88135MKCA00ZD"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE3","YR347P","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/03","5","88135MKCA00ZC"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE4","NHB70M","0","SET ILLUS,R MIRROR COVER","1513","2026/02/10","5","88135MKCA00ZB"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE5","NH463M","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/04","25","88135MKCA00ZA"
+"K*SP**","PO","SP","MKC","88135MKC A000 01","TYPE6","PB409P","7B","SET ILLUS,R MIRROR COVER","1513","2026/02/10","5","88135MKCA00ZF"
+"K*SP**","PO","SP","MKC","88135MKC L200","TYPE1","NHC33P","(KENSEI)7B","SET ILLUS,R MIRROR COVER","1513","2026/02/19","10","88135MKCL20ZA"
+"K*SP**","PO","SP","MKC","88135MLJ M000 01","TYPE1","NHA30M","(ミネベア素材)7B","SET ILLUS,R MIRROR COVER","1513","2026/02/06","5","88135MLJM00ZA"
+"K*SP**","PO","SP","MKC","88135MLJ M200 01","TYPE1","R337M","(ミネベア素材)7B","SET ILLUS,R MIRROR COVER","1513","2026/02/17","20","88135MLJM20ZA"
+"K*SP**","PO","SP","MKC","88140MLJ M000 01","YR387MC","YR387MC","(ミネベア素材)","COVER,L MIRROR","1513","2026/02/25","5","88140MLJM00ZE"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE1","R367C","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/25","15","88145MKCA00ZE"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE2","NHB53P","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/16","20","88145MKCA00ZD"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE3","YR347P","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/02","10","88145MKCA00ZC"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE4","NHB70M","0","SET ILLUS,L MIRROR COVER","1513","2026/02/11","5","88145MKCA00ZB"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE5","NH463M","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/05","10","88145MKCA00ZA"
+"K*SP**","PO","SP","MKC","88145MKC A000 01","TYPE6","PB409P","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/11","10","88145MKCA00ZF"
+"K*SP**","PO","SP","MKC","88145MLJ A000","TYPE1","NHB01","7B","SET ILLUS,L MIRROR COVER","1513","2026/02/06","25","88145MLJA00ZA"
+"K*SP**","PO","SP","MKC","88145MLJ AR00","TYPE1","NHC47P","(ミネベア素材)7B","SET ILLUS,L MIRROR COVER","1513","2026/02/06","10","88145MLJAR0ZD"
+"K*SP**","PO","SP","MKC","88145MLJ M000 01","TYPE1","NHA30M","(ミネベア素材)7B","SET ILLUS,L MIRROR COVER","1513","2026/02/09","5","88145MLJM00ZA"
+"K*SP**","PO","SP","MKC","88145MLJ M200 01","TYPE1","R337M","(ミネベア素材)7B","SET ILLUS,L MIRROR COVER","1513","2026/02/18","5","88145MLJM20ZA"
diff --git a/docs/060 データ/DB.xlsx b/docs/060 データ/DB.xlsx
new file mode 100644
index 0000000..4becd5f
Binary files /dev/null and b/docs/060 データ/DB.xlsx differ
diff --git a/docs/060 データ/POSP_20260310A.zip b/docs/060 データ/POSP_20260310A.zip
new file mode 100644
index 0000000..7982e4f
Binary files /dev/null and b/docs/060 データ/POSP_20260310A.zip differ
diff --git a/src/ExcelToCsvToDb/.gitattributes b/src/ExcelToCsvToDb/.gitattributes
new file mode 100644
index 0000000..1ff0c42
--- /dev/null
+++ b/src/ExcelToCsvToDb/.gitattributes
@@ -0,0 +1,63 @@
+###############################################################################
+# Set default behavior to automatically normalize line endings.
+###############################################################################
+* text=auto
+
+###############################################################################
+# Set default behavior for command prompt diff.
+#
+# This is need for earlier builds of msysgit that does not have it on by
+# default for csharp files.
+# Note: This is only used by command line
+###############################################################################
+#*.cs diff=csharp
+
+###############################################################################
+# Set the merge driver for project and solution files
+#
+# Merging from the command prompt will add diff markers to the files if there
+# are conflicts (Merging from VS is not affected by the settings below, in VS
+# the diff markers are never inserted). Diff markers may cause the following
+# file extensions to fail to load in VS. An alternative would be to treat
+# these files as binary and thus will always conflict and require user
+# intervention with every merge. To do so, just uncomment the entries below
+###############################################################################
+#*.sln merge=binary
+#*.csproj merge=binary
+#*.vbproj merge=binary
+#*.vcxproj merge=binary
+#*.vcproj merge=binary
+#*.dbproj merge=binary
+#*.fsproj merge=binary
+#*.lsproj merge=binary
+#*.wixproj merge=binary
+#*.modelproj merge=binary
+#*.sqlproj merge=binary
+#*.wwaproj merge=binary
+
+###############################################################################
+# behavior for image files
+#
+# image files are treated as binary by default.
+###############################################################################
+#*.jpg binary
+#*.png binary
+#*.gif binary
+
+###############################################################################
+# diff behavior for common document formats
+#
+# Convert binary document formats to text before diffing them. This feature
+# is only available from the command line. Turn it on by uncommenting the
+# entries below.
+###############################################################################
+#*.doc diff=astextplain
+#*.DOC diff=astextplain
+#*.docx diff=astextplain
+#*.DOCX diff=astextplain
+#*.dot diff=astextplain
+#*.DOT diff=astextplain
+#*.pdf diff=astextplain
+#*.PDF diff=astextplain
+#*.rtf diff=astextplain
+#*.RTF diff=astextplain
diff --git a/src/ExcelToCsvToDb/App.config b/src/ExcelToCsvToDb/App.config
new file mode 100644
index 0000000..712c93a
--- /dev/null
+++ b/src/ExcelToCsvToDb/App.config
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDb/BusinessLogic/ExcelToCsv.cs b/src/ExcelToCsvToDb/BusinessLogic/ExcelToCsv.cs
new file mode 100644
index 0000000..baa67c7
--- /dev/null
+++ b/src/ExcelToCsvToDb/BusinessLogic/ExcelToCsv.cs
@@ -0,0 +1,4287 @@
+using ClosedXML.Excel;
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Drawing;
+using DocumentFormat.OpenXml.EMMA;
+using DocumentFormat.OpenXml.ExtendedProperties;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using DocumentFormat.OpenXml.Office2010.ExcelAc;
+using DocumentFormat.OpenXml.Office2016.Excel;
+using DocumentFormat.OpenXml.Presentation;
+using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml.VariantTypes;
+using DocumentFormat.OpenXml.Vml;
+using DocumentFormat.OpenXml.Wordprocessing;
+using ExcelToCsvToDb.Commons;
+using ExcelToCsvToDb.DTO;
+using ExcelToCsvToDbCommon.Class;
+using KssSmaPlaLib.Batch.Commons;
+using KssSmaPlaLib.Batch.Interface;
+using KssSmaPlaLib.Commons;
+using KssSmaPlaLib.Commons.Conversion;
+using KssSmaPlaLib.DtoMapping.Attributes;
+using KssSmaPlaLib.InBox;
+using KssSmaPlaLib.Ini;
+using KssSmaPlaLib.IO.Excel;
+using KssSmaPlaLib.IO.File;
+using Microsoft.Extensions.Logging.Abstractions;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+
+namespace ExcelToCsvToDb.BusinessLogic
+{
+ ///
+ /// Excel→CSV処理クラス
+ ///
+ public class ExcelToCsv
+ {
+ ///
+ /// 日付並びの年月取得モード
+ ///
+ private enum ENUM_EXCEL_DATE_YM_GET_MODE
+ {
+ None,
+
+ ///
+ /// 年月セルから取得
+ /// (アルミ)
+ ///
+ FromYMCells,
+
+ ///
+ /// 日付型セル値より取得
+ /// (MC)
+ ///
+ FromDateCell,
+
+ ///
+ /// 日付型特定セル値より取得
+ /// (PoSp)
+ ///
+ FromTargetCellDate,
+
+ ///
+ /// シート名から取得
+ ///
+ FromSheetName,
+ }
+
+ ///
+ /// 日付並びの年月取得モードのINI値(文字列)
+ ///
+ private const string KEY_EXCEL_DATE_YM_GET_MODE_FROM_YM_CELLS = "FromYMCells";
+ private const string KEY_EXCEL_DATE_YM_GET_MODE_FROM_DATE_CELL = "FromDateCell";
+ private const string KEY_EXCEL_DATE_YM_GET_MODE_FROM_TARGET_CELL_DATE = "TargetCellDate";
+ private const string KEY_EXCEL_DATE_YM_GET_MODE_FROM_SHEET_NAME = "FromSheetName";
+
+ ///
+ /// ExcelToCsv機能(WeOrder版)
+ ///
+ /// INIパス
+ /// セクション名
+ /// 結果DTO
+ public FuncExcelToCsvWeOrderByIniResultDto TryFuncExcelToCsvWeOrderByIni(
+ string iniFilePath,
+ string sectionName)
+ {
+ // INIキー定義
+ const string KEY_IN_FOLDER_PATH = "InFolderPath";
+ const string KEY_FILE_NAME_PATTERN = "FileNamePattern";
+ const string KEY_EXCEL_SHEET_CHECK_ITEMS = "ExcelSheetCheckItems";
+ const string KEY_CSV_FILE_NAME = "CsvFileName";
+ const string KEY_OUT_FOLDER_PATH = "OutFolderPath";
+ const string KEY_FILE_DT_PREFIX = "FileDtPrefix";
+ const string KEY_FILE_DT_SUFFIX = "FileDtSuffix";
+ const string KEY_CSV_ENCODING = "CsvEncoding";
+
+ // 結果DTO
+ var result = new FuncExcelToCsvWeOrderByIniResultDto();
+
+ // 現在日時
+ DateTime now = DateTime.Now;
+
+ LoggerUxer.Info($"Excel→CSV機能(溶接加工計画)を開始します。");
+
+ // INI取得
+ var iniDic = IniReferenceResolveUxer.ReadSectionWithReference(
+ iniFilePath, sectionName);
+
+ // アイテムと列レターのマッピング辞書作成
+ if (!TryCreateItemColumnMappingDic(iniDic, out ItemColumnMappingDic, out var messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.CreateItemExcelColumnMappingDicError;
+ result.ResultMessage = messageForMe;
+ return result;
+ }
+
+ // 開始日取得
+ if (!CommonUxer.TryGetStartDate(iniDic, out var startDate, out messageForMe))
+ {
+ var msg = $"開始日の取得に失敗しました。[エラー内容:{messageForMe}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.StartDateError;
+ result.ResultMessage = msg;
+ return result;
+ }
+ LoggerUxer.Info($"[開始日:{startDate:yyyy/MM/dd}]");
+
+ // 入力フォルダパス
+ var inFolderPath = DictionaryUxer.GetValueOrDefault(iniDic, KEY_IN_FOLDER_PATH, string.Empty);
+ if (!CheckInFolder(inFolderPath, out messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.InFolderPathError;
+ result.ResultMessage = messageForMe;
+ return result;
+ }
+ LoggerUxer.Info($"[入力フォルダ:{inFolderPath}]");
+
+ // 対象ファイル群取得
+ var fileNamePattern = DictionaryUxer.GetValueOrDefault(iniDic, KEY_FILE_NAME_PATTERN, "*");
+ if (!GetFiles(
+ iniDic,
+ inFolderPath,
+ fileNamePattern,
+ out List files,
+ out messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.TargetFilesGetError;
+ result.ResultMessage = messageForMe;
+ return result;
+ }
+
+ if (files.Count == 0)
+ {
+ var msg = $"対象ファイルがありません。[{KEY_IN_FOLDER_PATH}:{inFolderPath},{KEY_FILE_NAME_PATTERN}={fileNamePattern}]";
+ LoggerUxer.Warn(msg);
+ result.Succeeded = true;
+ result.ResultMessage = msg;
+ // ワーニングでも成功
+ return result;
+ }
+
+ // シートチェック項目取得
+ var sheetCheckStr = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_SHEET_CHECK_ITEMS, string.Empty);
+ LoggerUxer.Info($"[Excelシートチェック項目:{sheetCheckStr}]");
+ if (!TryGetExcelSheetCheckItemsFromIni(sheetCheckStr, out var sheetCheckItems))
+ {
+ var msg = $"Excelシートチェック項目が不正です。[キー:{KEY_EXCEL_SHEET_CHECK_ITEMS},値:{sheetCheckStr}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.ExcelSheelCheckItemInvalid;
+ result.ResultMessage = msg;
+ return result;
+ }
+
+ try
+ {
+ var weOrderList = new List();
+
+ // 1ファイル処理
+ foreach (var file in files)
+ {
+ var ret = RunOneFile(sectionName, file, now, sheetCheckItems, iniDic, startDate, weOrderList);
+ if (ret != (int)Common.RetCode.Success)
+ {
+ result.Succeeded = false;
+ result.ExitCode = ret;
+ return result;
+ }
+ }
+
+ if (weOrderList.Count == 0)
+ {
+ var msg = $"対象データがありません。[{KEY_IN_FOLDER_PATH}:{inFolderPath},{KEY_FILE_NAME_PATTERN}={fileNamePattern}]";
+ LoggerUxer.Warn(msg);
+ result.Succeeded = true;
+ result.ResultMessage = msg;
+ // ワーニングでも成功
+ return result;
+ }
+
+ // ファイル名:未指定時はエラーとする
+ var fileName = DictionaryUxer.GetValueOrDefault(iniDic, KEY_CSV_FILE_NAME, string.Empty);
+ if (string.IsNullOrEmpty(fileName))
+ {
+ var msg = $"設定ファイルにCSVファイル名が指定されていません。[キー:{KEY_CSV_FILE_NAME}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.CsvFileNameNotSetting;
+ result.ResultMessage = msg;
+ return result;
+ }
+
+ if (fileName.IndexOf('.') == -1)
+ {
+ // 拡張子がないとき、付与する
+ fileName += ".csv";
+ LoggerUxer.Info($"CSVファイル名に拡張子を付与しました。[ファイル名:{fileName}]");
+ }
+
+ // CSVファイルパス作成
+ var csvPath = PathUxer.CreateFullPathEx(
+ DictionaryUxer.GetValueOrDefault(iniDic, KEY_OUT_FOLDER_PATH, string.Empty),
+ fileName,
+ DictionaryUxer.GetValueOrDefault(iniDic, KEY_FILE_DT_PREFIX, string.Empty),
+ DictionaryUxer.GetValueOrDefault(iniDic, KEY_FILE_DT_SUFFIX, string.Empty));
+ LoggerUxer.Info($"[CSVファイルパス:{csvPath}]");
+
+ // リストを圧縮(重複キーは排除)
+ var maeCnt = weOrderList.Count;
+ weOrderList = weOrderList
+ .GroupBy(x => new
+ {
+ x.LineName,
+ x.BasicPartsNo,
+ x.WorkDate
+ })
+ .Select(g => new WeOrderDto
+ {
+ LineId = g.Min(x => x.LineId),
+ LineName = g.Key.LineName,
+ BasicPartsNo = g.Key.BasicPartsNo,
+ WorkDate = g.Key.WorkDate,
+ CreateRecordDate = g.Min(x => x.CreateRecordDate),
+ AfAmount = g.Sum(x => x.AfAmount),
+ WeAmount = g.Sum(x => x.WeAmount),
+ KdWeAmount = g.Sum(x => x.KdWeAmount),
+ ProductionLur = g.Max(x => x.ProductionLur),
+ ModelCd = g.Min(x => x.ModelCd),
+ Derivation = g.Min(x => x.Derivation),
+ TactTime = g.Min(x => x.TactTime)
+ })
+ .ToList();
+
+ var atoCnt = weOrderList.Count;
+ LoggerUxer.Info($"再集計圧縮完了。[前:{maeCnt}件,後:{atoCnt}件]");
+
+ // エンコーディング指定(オプション)
+ var encodingTypeName = DictionaryUxer.GetValueOrDefault(iniDic, KEY_CSV_ENCODING, "utf8");
+ var encodingType = EncodingUxer.GetEncodingType(encodingTypeName);
+ if (encodingType == null)
+ {
+ encodingType = EncodingUxer.EncodingType.Utf8WithoutBom;
+ LoggerUxer.Warn($"CSVエンコーディングタイプ名が不正です。UFT-8で処理します。[キー:{KEY_CSV_ENCODING},値:{encodingTypeName}]");
+ }
+
+ // リストをCSV出力
+ if (!CsvUxer.ExportToCsv(
+ weOrderList,
+ csvPath,
+ out messageForMe,
+ (EncodingUxer.EncodingType)encodingType))
+ {
+ LoggerUxer.Error(messageForMe);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.ExportToCsvError;
+ result.ResultMessage = messageForMe;
+ return result;
+ }
+ LoggerUxer.Info($"[出力件数:{weOrderList.Count}]");
+
+ LoggerUxer.Info($"Excel→CSV機能(溶接加工計画)が終了しました。");
+
+ result.Succeeded = true;
+ return result;
+ }
+ catch (Exception ex)
+ {
+ var msg = $"エラーが発生しました。[Run(),エラー内容:{ex.Message}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.ExcelToCsvException;
+ result.ResultMessage = msg;
+ return result;
+ }
+ }
+
+ ///
+ /// ExcelToCsv機能(簡易版)
+ ///
+ /// INIパス
+ /// セクション名
+ /// 結果DTO
+ public FuncExcelToCsvWeOrderByIniResultDto TryFuncExcelToCsvEazyByIni(
+ string iniFilePath,
+ string sectionName)
+ {
+ // INIキー定義
+ const string KEY_IN_FOLDER_PATH = "InFolderPath";
+ const string KEY_FILE_NAME_PATTERN = "FileNamePattern";
+ const string KEY_EXCEL_SHEET_CHECK_ITEMS = "ExcelSheetCheckItems";
+ const string KEY_OUTPUT_TYPE = "OutputType";
+ const string KEY_CSV_FILE_NAME = "CsvFileName";
+ const string KEY_OUT_FOLDER_PATH = "OutFolderPath";
+ const string KEY_FILE_DT_PREFIX = "FileDtPrefix";
+ const string KEY_FILE_DT_SUFFIX = "FileDtSuffix";
+ const string KEY_CSV_ENCODING = "CsvEncoding";
+ const string KEY_KANI_TOKUSHU = "KaniTokushu";
+
+ // 結果DTO
+ var result = new FuncExcelToCsvWeOrderByIniResultDto();
+
+ // ラインIDヘルパー
+ LineIdHelper lineIdHelper = new LineIdHelper();
+
+ // 現在日時
+ DateTime now = DateTime.Now;
+
+ LoggerUxer.Info($"Excel→CSV機能(簡易版)を開始します。");
+
+ // INI取得
+ var iniDic = IniReferenceResolveUxer.ReadSectionWithReference(
+ iniFilePath, sectionName);
+
+ // 開始日取得
+ if (!CommonUxer.TryGetStartDate(iniDic, out var startDate, out var messageForMe))
+ {
+ var msg = $"開始日の取得に失敗しました。[エラー内容:{messageForMe}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.StartDateError;
+ result.ResultMessage = msg;
+ return result;
+ }
+ LoggerUxer.Info($"[開始日:{startDate:yyyy/MM/dd}]");
+
+ // 終了日取得(指定ありのときのみ)
+ if (!CommonUxer.TryGetEndDate(iniDic, startDate, out var endDate, out messageForMe))
+ {
+ var msg = $"終了日の取得に失敗しました。[エラー内容:{messageForMe}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.EndDateError;
+ result.ResultMessage = msg;
+ return result;
+ }
+ if (endDate is null)
+ {
+ LoggerUxer.Info($"[終了日:なし]");
+ }
+ else
+ {
+ LoggerUxer.Info($"[終了日:{((DateTime)endDate):yyyy/MM/dd}]");
+ }
+
+ // 入力フォルダパス
+ var inFolderPath = DictionaryUxer.GetValueOrDefault(iniDic, KEY_IN_FOLDER_PATH, string.Empty);
+ if (!CheckInFolder(inFolderPath, out messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.InFolderPathError;
+ result.ResultMessage = messageForMe;
+ return result;
+ }
+ LoggerUxer.Info($"[入力フォルダ:{inFolderPath}]");
+
+ // 対象ファイル群取得
+ var fileNamePattern = DictionaryUxer.GetValueOrDefault(iniDic, KEY_FILE_NAME_PATTERN, "*");
+ if (!GetFiles(
+ iniDic,
+ inFolderPath,
+ fileNamePattern,
+ out List files,
+ out messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.TargetFilesGetError;
+ result.ResultMessage = messageForMe;
+ return result;
+ }
+
+ if (files.Count == 0)
+ {
+ var msg = $"対象ファイルがありません。[{KEY_IN_FOLDER_PATH}:{inFolderPath},{KEY_FILE_NAME_PATTERN}={fileNamePattern}]";
+ LoggerUxer.Warn(msg);
+ result.Succeeded = true;
+ result.ResultMessage = msg;
+ // ワーニングでも成功
+ return result;
+ }
+
+ try
+ {
+ var lineList = new List();
+
+ // 1ファイル処理
+ foreach (var file in files)
+ {
+ // ライン判別とINI更新
+ if (!LineHanteiFromFilePathAndReloadIni(
+ file, iniDic, sectionName,
+ out var id, out var excelSettings, out messageForMe))
+ {
+ LoggerUxer.Error($"ライン判別とINI更新に失敗しました。[詳細:{messageForMe}]");
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.ExcelSettingsError;
+ return result;
+ }
+
+ // ラインID更新
+ lineIdHelper.FileLineId = id;
+
+ // アイテムと列レターのマッピング辞書作成
+ if (!TryCreateRetsuDic(iniDic, out var cdList, out messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.ExcelSettingsError;
+ return result;
+ }
+
+ // 特殊処理判定
+ var kaniTokushu = DictionaryUxer.GetValueOrDefault(iniDic, KEY_KANI_TOKUSHU, string.Empty);
+ LoggerUxer.Info($"[簡易特殊処理({KEY_KANI_TOKUSHU}):{(string.IsNullOrEmpty(kaniTokushu) ? "なし" : kaniTokushu)}]");
+ switch (kaniTokushu)
+ {
+ case "":
+ // 特殊なし:処理継続
+ break;
+ case "鋳造LPDC":
+ // 鋳造LPDC
+ if (!TryKaniChuzoLpdc(file, out var tokushuOutList, out messageForMe))
+ {
+ LoggerUxer.Error($"特殊処理(鋳造LPDC)に失敗しました。[詳細:{messageForMe}]");
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.KaniTokushuError;
+ return result;
+ }
+ lineList.AddRange(CreateFormattedTextAll(iniDic, cdList, tokushuOutList));
+ lineIdHelper.FileLineId = -1;
+ continue;
+ case "鋳造GDC":
+ // 鋳造GDC
+ if (!TryKaniChuzoGdc(file, out tokushuOutList, out messageForMe))
+ {
+ LoggerUxer.Error($"特殊処理(鋳造GDC)に失敗しました。[詳細:{messageForMe}]");
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.KaniTokushuError;
+ return result;
+ }
+ lineList.AddRange(CreateFormattedTextAll(iniDic, cdList, tokushuOutList));
+ lineIdHelper.FileLineId = -1;
+ continue;
+ default:
+ LoggerUxer.Error($"簡易特殊処理の指定が不正です。[{KEY_KANI_TOKUSHU}:{kaniTokushu}]");
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.KaniTokushuError;
+ return result;
+ }
+
+ // シートチェック項目取得
+ var sheetCheckStr = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_SHEET_CHECK_ITEMS, string.Empty);
+ LoggerUxer.Info($"[Excelシートチェック項目:{sheetCheckStr}]");
+ if (!TryGetExcelSheetCheckItemsFromIni(sheetCheckStr, out var sheetCheckItems))
+ {
+ var msg = $"Excelシートチェック項目が不正です。[キー:{KEY_EXCEL_SHEET_CHECK_ITEMS},値:{sheetCheckStr}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.ExcelSheelCheckItemInvalid;
+ result.ResultMessage = msg;
+ return result;
+ }
+
+ // 1ファイル処理
+ var outList = new List();
+ var ret = RunOneFileEazy(
+ file, now, sheetCheckItems,
+ iniDic, excelSettings,
+ startDate, endDate,
+ lineIdHelper,
+ cdList, outList);
+ if (ret != (int)Common.RetCode.Success)
+ {
+ result.Succeeded = false;
+ result.ExitCode = ret;
+ return result;
+ }
+
+ // 出力タイプ
+ var type = DictionaryUxer.GetValueOrDefault(iniDic, KEY_OUTPUT_TYPE, "CSV");
+ switch (type)
+ {
+ case "FormattedText":
+ lineList.AddRange(CreateFormattedTextAll(iniDic, cdList, outList));
+ break;
+ default:
+ // CSV扱い
+ // ヘッダ
+ lineList.Add(
+ ColumnDefinition.GetCsvHeader(cdList));
+ // データ
+ lineList.AddRange(
+ outList.Select(
+ row => string.Join(
+ ",", row.Select(field => $"\"{field}\""))));
+ break;
+ }
+ lineIdHelper.FileLineId = -1;
+ }
+
+ if (lineList.Count == 0)
+ {
+ var msg = $"対象データがありません。[{KEY_IN_FOLDER_PATH}:{inFolderPath},{KEY_FILE_NAME_PATTERN}={fileNamePattern}]";
+ LoggerUxer.Warn(msg);
+ result.Succeeded = true;
+ result.ResultMessage = msg;
+ // ワーニングでも成功
+ return result;
+ }
+
+ // ファイル名:未指定時はエラーとする
+ var fileName = DictionaryUxer.GetValueOrDefault(iniDic, KEY_CSV_FILE_NAME, string.Empty);
+ if (string.IsNullOrEmpty(fileName))
+ {
+ var msg = $"設定ファイルにCSVファイル名が指定されていません。[キー:{KEY_CSV_FILE_NAME}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.CsvFileNameNotSetting;
+ result.ResultMessage = msg;
+ return result;
+ }
+
+ if (fileName.IndexOf('.') == -1)
+ {
+ // 拡張子がないとき、付与する
+ fileName += ".csv";
+ LoggerUxer.Info($"CSVファイル名に拡張子を付与しました。[ファイル名:{fileName}]");
+ }
+
+ // 出力ファイルパス作成
+ var outputFilePath = PathUxer.CreateFullPathEx(
+ DictionaryUxer.GetValueOrDefault(iniDic, KEY_OUT_FOLDER_PATH, string.Empty),
+ fileName,
+ DictionaryUxer.GetValueOrDefault(iniDic, KEY_FILE_DT_PREFIX, string.Empty),
+ DictionaryUxer.GetValueOrDefault(iniDic, KEY_FILE_DT_SUFFIX, string.Empty));
+ LoggerUxer.Info($"[CSVファイルパス:{outputFilePath}]");
+
+ // エンコーディング指定(オプション)
+ var encodingTypeName = DictionaryUxer.GetValueOrDefault(iniDic, KEY_CSV_ENCODING, "utf8");
+ var encodingType = EncodingUxer.GetEncodingType(encodingTypeName);
+ if (encodingType == null)
+ {
+ encodingType = EncodingUxer.EncodingType.Utf8WithoutBom;
+ LoggerUxer.Warn($"CSVエンコーディングタイプ名が不正です。UFT-8で処理します。[キー:{KEY_CSV_ENCODING},値:{encodingTypeName}]");
+ }
+
+ // 出力
+ System.IO.File.WriteAllLines(
+ outputFilePath, lineList,
+ EncodingUxer.GetEncoding(
+ (EncodingUxer.EncodingType)encodingType));
+
+ LoggerUxer.Info($"[出力件数:{lineList.Count}]");
+
+ LoggerUxer.Info($"Excel→CSV機能(簡易版)が終了しました。");
+
+ result.Succeeded = true;
+ return result;
+ }
+ catch (Exception ex)
+ {
+ var msg = $"エラーが発生しました。[Run(),エラー内容:{ex.Message}]";
+ LoggerUxer.Error(msg);
+ result.Succeeded = false;
+ result.ExitCode = (int)Common.RetCode.ExcelToCsvException;
+ result.ResultMessage = msg;
+ return result;
+ }
+ }
+
+ ///
+ /// 簡易処理(鋳造LPDC)
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static bool TryKaniChuzoLpdc(
+ string filePath,
+ out List outList,
+ out string resultMessage)
+ {
+ const string SHEET_NAME_JISSEKI_NYURYOKU = "実績入力";
+ const string SHEET_NAME_CHUZO_IN = "鋳造IN";
+
+ outList = new List();
+ resultMessage = string.Empty;
+
+ try
+ {
+ // 開く
+ using (var book = LoadWorkbookWithoutPhoneticError(filePath))
+ {
+ // シート有無CK
+ if (!book.Worksheets.Any(m => m.Name == SHEET_NAME_JISSEKI_NYURYOKU))
+ {
+ resultMessage = $"「実績入力」シートがありません。[ファイル:{filePath}]";
+ return false;
+ }
+ if (!book.Worksheets.Any(m => m.Name == SHEET_NAME_CHUZO_IN))
+ {
+ resultMessage = $"「鋳造IN」シートがありません。[ファイル:{filePath}]";
+ return false;
+ }
+
+ // 実績入力IN
+ List jnList = new List();
+ var sheet = book.Worksheet(SHEET_NAME_JISSEKI_NYURYOKU);
+ for (var row = 12; ; row++)
+ {
+ if (string.IsNullOrEmpty(sheet.Cell(row, 2).GetFormattedString().Trim()))
+ {
+ break;
+ }
+ jnList.Add(new KaniChuzoLpdcJissekiNyuryokuDto()
+ {
+ Date = DateTime.TryParse(sheet.Cell(row, 2).GetFormattedString().Trim(), out var dat) ? dat : DateTime.MinValue,
+ Kishu = sheet.Cell(row, 3).GetFormattedString().Trim(),
+ Suryo = int.TryParse(sheet.Cell(row, 4).GetFormattedString().Trim(), out var intv) ? intv : int.MinValue,
+ Furyo = int.TryParse(sheet.Cell(row, 5).GetFormattedString().Trim(), out intv) ? intv : int.MinValue,
+ Hensu = sheet.Cell(row, 6).GetFormattedString().Trim(),
+ });
+ }
+
+ // 鋳造ININ
+ List ciList = new List();
+ sheet = book.Worksheet(SHEET_NAME_CHUZO_IN);
+ var yearText = XlUxer.GCell(sheet, 2, 3).GetFormattedString().Replace("年", "").Trim();
+ var year = int.TryParse(yearText, out var intVal) ? intVal : 1900;
+ var monthText = XlUxer.GCell(sheet, 2, 5).GetFormattedString().Replace("月", "").Trim();
+ var month = int.TryParse(monthText, out intVal) ? intVal : 1;
+ var karaCnt = 0;
+ for (var row = 7; ; row++)
+ {
+ if (string.IsNullOrEmpty(sheet.Cell(row, 2).GetFormattedString().Trim()))
+ {
+ karaCnt++;
+ if (karaCnt >= 10)
+ {
+ break;
+ }
+ continue;
+ }
+ karaCnt = 0;
+ for (var col = 5; ; col++)
+ {
+ var dayText = sheet.Cell(6, col).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(dayText)) break;
+ if (dayText == "TLL") break;
+ if (!int.TryParse(dayText, out var dayInt)) break;
+
+ var text = sheet.Cell(row, col).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(text)) continue;
+ if (text == "0") continue;
+
+ var su = int.TryParse(text, out intVal) ? intVal : int.MinValue;
+ ciList.Add(new KaniChuzoLpdcChuzoInDto()
+ {
+ Kishu = sheet.Cell(row, 2).GetFormattedString().Trim(),
+ Buban = sheet.Cell(row, 3).GetFormattedString().Trim(),
+ Kubun = sheet.Cell(row, 4).GetFormattedString().Trim(),
+ Date = new DateTime(year, month, dayInt),
+ Su = su,
+ });
+ }
+ }
+
+ // 【残】jnListとciListをマージして、outListに出力する
+
+ //var jn1 = jnList
+ // .Select(m => new { m.Kishu, m.Date, m.Suryo })
+ // .OrderBy(m => m.Kishu)
+ // .ThenBy(m => m.Date)
+ // .ToList();
+ //foreach (var dto in jnList)
+ // System.Diagnostics.Debug.WriteLine(
+ // $"{dto.Kishu}\t{dto.Date}\t{dto.Suryo}");
+ //var ci1 = ciList
+ // .GroupBy(m=>new {m.Kishu,m.Date})
+ // .Select(m => new { m.Key.Kishu, m.Key.Date, Total = m.Sum(n=>n.Su), })
+ // .OrderBy(m => m.Kishu)
+ // .ThenBy(m => m.Date)
+ // .ToList();
+ //foreach (var dto in ciList)
+ // System.Diagnostics.Debug.WriteLine(
+ // $"{dto.Kishu}\t{dto.Date}\t{dto.Su}");
+ }
+
+ }
+ catch (Exception ex)
+ {
+ LoggerUxer.Error($"特殊処理(鋳造LPDC)にてエラーが発生しました。[{ex.Message}]");
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// 簡易処理(鋳造GDC)
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static bool TryKaniChuzoGdc(
+ string filePath,
+ out List outList,
+ out string resultMessage)
+ {
+ const string SHEET_NAME_BEFORE = "*月*鋳造計画";
+ const string SHEET_NAME_AFTER = "払出し";
+
+ outList = new List();
+ resultMessage = string.Empty;
+
+ try
+ {
+ // 開く
+ using (var book = LoadWorkbookWithoutPhoneticError(filePath))
+ {
+ LoggerUxer.Info($"[対象ファイル:{filePath}]");
+ var targetIn = false;
+ foreach (var sheet in book.Worksheets)
+ {
+ if (StringUxer.WildcardMatch(sheet.Name, SHEET_NAME_BEFORE))
+ {
+ // 対象シート開始前検知(次のシートから対象にする)
+ targetIn = true;
+ continue;
+ }
+ if (StringUxer.WildcardMatch(sheet.Name, SHEET_NAME_AFTER))
+ {
+ // 対象シート終了後検知(シート処理終わり)
+ break;
+ }
+ // 対象シート中でないとき飛ばす
+ if (!targetIn) continue;
+
+ // 一応シートのチェック
+ if (sheet.Cell("E2").GetFormattedString().Trim()!= "鋳造MO" ||
+ sheet.Cell("E3").GetFormattedString().Trim() != "GDC" ||
+ sheet.Cell("K3").GetFormattedString().Trim() != "月生産管理")
+ {
+ resultMessage = $"シート内容が不正です。[ファイル:{filePath},シート:{sheet.Name}]";
+ return false;
+ }
+ LoggerUxer.Info($"[対象シート:{sheet.Name}]");
+
+ var kugyoCnt = 0;
+ for (var row = 7; row < 1000; row++)
+ {
+ var a = XlUxer.GCell(sheet, "A" + row).GetFormattedString().Trim();
+ var b = XlUxer.GCell(sheet, "B" + row).GetFormattedString().Trim();
+ var c = XlUxer.GCell(sheet, "C" + row).GetFormattedString().Trim();
+ var d = XlUxer.GCell(sheet, "D" + row).GetFormattedString().Trim();
+ var f = XlUxer.GCell(sheet, "F" + row).GetFormattedString().Trim();
+
+ if (string.IsNullOrEmpty(b))
+ {
+ kugyoCnt++;
+ if (kugyoCnt >= 10) break;
+ continue;
+ }
+
+ int[] su = new int[31];
+ for (var col = 8; col < 8 + 31; col++)
+ {
+ var strVal = XlUxer.GCell(sheet, row, col).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(strVal)) continue;
+
+ int intVal = int.TryParse(strVal, out var intV) ? intV : int.MinValue;
+
+ aaaaaaa
+
+
+ }
+ }
+
+
+ }
+
+
+
+ }
+ }
+ catch (Exception ex)
+ {
+ LoggerUxer.Error($"特殊処理(鋳造LPDC)にてエラーが発生しました。[{ex.Message}]");
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// 書式付きテキスト作成
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static List CreateFormattedTextAll(
+ Dictionary iniDic,
+ List cdList,
+ List outList)
+ {
+ const string INI_KEY_FORMATTED_TEXT_FORMAT_FILE = "FormattedTextFormatFile";
+
+ var ftff = DictionaryUxer.GetValueOrDefault(iniDic, INI_KEY_FORMATTED_TEXT_FORMAT_FILE, string.Empty);
+ if (string.IsNullOrEmpty(ftff))
+ return new List() { $"[ERROR]INI未設定です。[キー:{INI_KEY_FORMATTED_TEXT_FORMAT_FILE}]" };
+
+ var patterns = ftff.Split('|');
+
+ List ftffList = new List();
+ foreach (var pattern in patterns)
+ {
+ var items = pattern.Split(',');
+
+ var dto = new FormattedTextPatternDto();
+
+ if (items.Length == 1)
+ {
+ dto.FileName = items[0].Trim();
+ }
+ else if (items.Length == 3)
+ {
+ dto.ColumnName = items[0].Trim();
+ dto.JudgeValue = items[1].Trim();
+ dto.FileName = items[2].Trim();
+ }
+ else
+ {
+ dto.Format = $"書式つきテキストパターン定義に不備があります。[キー:{INI_KEY_FORMATTED_TEXT_FORMAT_FILE},値:{pattern}]";
+ }
+ if (!string.IsNullOrEmpty(dto.FileName))
+ {
+ if (dto.FileName.IndexOf("\\") < 0)
+ dto.FileName = ".\\" + dto.FileName;
+
+ if (!File.Exists(dto.FileName))
+ {
+ dto.Format = $"書式ファイルがありません。[キー:{INI_KEY_FORMATTED_TEXT_FORMAT_FILE},ファイル名:{dto.FileName}]";
+ }
+ else
+ {
+ try
+ {
+ using (var sr = new StreamReader(dto.FileName))
+ {
+ dto.Format = sr.ReadToEnd();
+ }
+ }
+ catch (Exception ex)
+ {
+ dto.Format = $"ファイルの読み込みに失敗しました。[パス:{dto.FileName},詳細:{ex.Message}]";
+ }
+ }
+ }
+ ftffList.Add(dto);
+ }
+ List list = new List();
+
+ // 行
+ foreach (var items in outList)
+ {
+ if (items.Length != cdList.Count)
+ {
+ list.Add($"列数が合いません。[列定義数:{cdList.Count},行データ:{string.Join(",",items)}]");
+ continue;
+ }
+ var format = string.Empty;
+ foreach (var dto in ftffList)
+ {
+ if (string.IsNullOrEmpty(dto.ColumnName) ||
+ string.IsNullOrEmpty(dto.JudgeValue))
+ {
+ // その他:即時これを適用
+ format = dto.Format;
+ break;
+ }
+ else
+ {
+ var cd = cdList.FirstOrDefault(m => m.LogicalName == dto.ColumnName);
+ if (cd is null) continue;
+ var index = cdList.IndexOf(cd);
+ switch(dto.JudgeValue)
+ {
+ case "@@@EMPTY@@@":
+ if (string.IsNullOrEmpty(items[index]))
+ {
+ format = dto.Format;
+ break;
+ }
+ break;
+ case "@@@NOT_EMPTY@@@":
+ if (!string.IsNullOrEmpty(items[index]))
+ {
+ format = dto.Format;
+ break;
+ }
+ break;
+ default:
+ if (items[index] == dto.JudgeValue)
+ {
+ format = dto.Format;
+ break;
+ }
+ break;
+ }
+ if (!string.IsNullOrEmpty(format)) break;
+ }
+ }
+ // 項目値で置換し出力レコードを作成
+ var line = format;
+ for (var index2 = 0; index2 < items.Length; index2++)
+ {
+ line = line.Replace($"@@@{cdList[index2].LogicalName}@@@", items[index2]);
+ }
+ list.Add(line);
+ }
+ return list;
+ }
+
+ ///
+ /// DTOでExcelColumnLetterAttribute属性がついたプロパティの辞書作成
+ ///
+ /// 作成した辞書
+ private static Dictionary CreateExcelColumnDtoPropDic()
+ {
+ // 属性付きのプロパティのみ抽出
+ var list = typeof(WeOrderDto).GetProperties()
+ .Select(p => new
+ {
+ p.Name,
+ ExcelLetter = p.GetCustomAttribute()?.ColumnLetter
+ })
+ .Where(p => p.ExcelLetter != null)
+ .ToList();
+
+ // 辞書化
+ Dictionary dic = new Dictionary();
+ foreach (var item in list)
+ {
+ dic.Add(item.Name, item.ExcelLetter);
+ }
+ return dic;
+ }
+
+ private static bool TryCreateRetsuDic(Dictionary iniDic, out List cdList, out string resultMessage)
+ {
+ cdList = new List();
+ resultMessage = string.Empty;
+
+ for (var cnt = 0; cnt < 1000; cnt++)
+ {
+ var key = $"Col{cnt:d3}";
+
+ var iniValue = DictionaryUxer.GetValueOrDefault(
+ iniDic, key, string.Empty);
+
+ if (string.IsNullOrEmpty(iniValue)) continue;
+
+ var dto = ColumnDefinition.Parse(iniValue, out var messageForMe);
+ if (dto is null)
+ {
+ resultMessage = $"列定義に不備があります。[キー:{key},設定値:{iniValue},エラー詳細:{messageForMe}]";
+ return false;
+ }
+ cdList.Add(dto);
+ }
+ return true;
+ }
+
+ // INIキー定義
+ private const string KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING = "ExcelItemNameAndColumnLetterMapping";
+
+ ///
+ /// DTOアイテムの列レターマッピング辞書作成
+ ///
+ /// INIDIC
+ /// [OUT]作成した辞書
+ /// [OUT]結果メッセージ
+ /// 成否
+ private bool TryCreateItemColumnMappingDic(DictionaryiniDic, out Dictionary dic, out string resultMessage)
+ {
+ resultMessage = string.Empty;
+
+ // Excel列レター属性を有するDTOプロパティ名のリスト
+ dic = CreateExcelColumnDtoPropDic();
+ LoggerUxer.Info($"[Excel列レター属性を有するアイテム名のリスト:{string.Join(",", dic.Keys)}]");
+ LoggerUxer.Info($"[Excel列レター属性を有するアイテムの列レターのリスト:{string.Join(",", dic.Values)}]");
+
+ // INIの拡張定義を取得
+ var str = DictionaryUxer.GetValueOrDefault(
+ iniDic,
+ KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING,
+ string.Empty);
+
+ // INIに拡張定義がないとき、デフォルトのみなので終了
+ if (string.IsNullOrEmpty(str)) return true;
+
+ var maps = str.Split('|');
+ foreach (var map in maps)
+ {
+ var kvp = map.Split(':');
+ if (kvp.Length != 2)
+ {
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定で「アイテム名:列レター」書式が不正です。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},値:{str}]";
+ LoggerUxer.Error(resultMessage);
+ return false;
+ }
+
+ // アイテム名のバリデ
+ if (!dic.Keys.Contains(kvp[0]))
+ {
+ // エラー時(アイテム名誤りまたは指定アイテムにExcel列レター属性が無い)
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定で「アイテム名」が対象のアイテム名に含まれません。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},値:{str},アイテム名:{kvp[0]}]";
+ LoggerUxer.Error(resultMessage);
+ LoggerUxer.Info($"[有効なアイテム名:{string.Join(",", dic.Keys)}]");
+ return false;
+ }
+
+ //kvp[1] = kvp[1].ToUpper();
+
+ if (kvp[1].IndexOf(",") != -1)
+ {
+ // Excel列以外の指定(別のところから取得)の場合
+ var strSplit = kvp[1].Split(',');
+ // 漁法名
+ switch(strSplit[0])
+ {
+ case "別シート":
+ if (strSplit.Length != 5)
+ {
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定でCSV要素数が違います。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},漁法名:{strSplit[0]}]";
+ LoggerUxer.Error(resultMessage);
+ return false;
+ }
+ if (!ExcelCellValidatorUxer.IsValidA1Format(strSplit[2] + "1"))
+ {
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定で列レターが不正です。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},漁法名:{strSplit[0]},列レター:{strSplit[2]}]";
+ LoggerUxer.Error(resultMessage);
+ return false;
+ }
+ if (!ExcelCellValidatorUxer.IsValidA1Format(strSplit[3] + "1"))
+ {
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定で列レターが不正です。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},漁法名:{strSplit[0]},列レター:{strSplit[3]}]";
+ LoggerUxer.Error(resultMessage);
+ return false;
+ }
+ if (!int.TryParse(strSplit[4], out var intVal) || intVal < 1)
+ {
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定で開始行番号が不正です。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},漁法名:{strSplit[0]},開始行番号:{strSplit[4]}]";
+ LoggerUxer.Error(resultMessage);
+ return false;
+ }
+ break;
+ default:
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定で「漁法名」が未存在です。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},漁法名:{strSplit[0]}]";
+ LoggerUxer.Error(resultMessage);
+ return false;
+ }
+ }
+ // Excel列レターのバリデ
+ else if (!XlUxer.TryConvertColLetterToNumber(kvp[1].ToUpper(), out var colNo))
+ {
+ // バリデエラー
+ resultMessage = $"設定ファイルのアイテム-列レターマッピング指定で「列レター」書式が不正です。[キー:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING},列レター値:{kvp[1]}]";
+ LoggerUxer.Error(resultMessage);
+ return false;
+ }
+
+ // 辞書を更新
+ dic[kvp[0]] = kvp[1];
+ }
+ return true;
+ }
+
+ ///
+ /// 入力フォルダパスのチェック
+ ///
+ /// 入力フォルダパス
+ /// メッセージ
+ /// 成否
+ private static bool CheckInFolder(string folderPath, out string resultMessage)
+ {
+ resultMessage = string.Empty;
+ if (string.IsNullOrEmpty(folderPath))
+ {
+ resultMessage = $"設定ファイルに入力フォルダパスが設定されていません。";
+ return false;
+ }
+ if (!Directory.Exists(folderPath))
+ {
+ resultMessage = $"設定ファイルの入力フォルダパスのフォルダが存在しません。[入力フォルダパス:{folderPath}]";
+ return false;
+ }
+ return true;
+ }
+
+ // INIキー定義
+ private const string KEY_EXCEL_INPUT_FILE_PATTERN_ONLY_NEWEST = "ExcelInputFilePatternOnlyNewest";
+
+ ///
+ /// 対象ファイル群(ファイル名パターン合致)のファイルパスリスト取得
+ ///
+ /// INI辞書
+ /// 入力フォルダパス
+ /// 入力ファイル名(パターン)
+ /// [出力]対象ファイル群
+ /// [出力]メッセージ
+ /// 成否
+ private static bool GetFiles(
+ Dictionary iniDic,
+ string inFolderPath,
+ string fileNamePattern,
+ out List files,
+ out string resultMessage)
+ {
+ resultMessage = string.Empty;
+
+ // パターン一致ファイル群中、最新の1件のみか?
+ var newestOnly = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_INPUT_FILE_PATTERN_ONLY_NEWEST, string.Empty) == "1";
+
+ string[] paths = null;
+
+ if (newestOnly)
+ {
+ // パターン一致ファイル群中の更新日時が最新のもの1つだけ
+ string latestFile = Directory.GetFiles(inFolderPath, fileNamePattern)
+ .OrderByDescending(f => File.GetLastWriteTime(f))
+ .FirstOrDefault();
+ if (string.IsNullOrEmpty(latestFile))
+ {
+ // 該当なしの時、空配列
+ paths = new string[0];
+ }
+ else
+ {
+ // 該当ありの時、1個のみ
+ paths = new string[] { latestFile };
+ }
+ }
+ else
+ {
+ paths = Directory.GetFiles(inFolderPath, fileNamePattern);
+ }
+
+ files = paths.ToList();
+ return true;
+ }
+
+ ///
+ /// 1ファイル実行
+ ///
+ /// Excelファイルパス
+ /// シートチェック項目リスト
+ /// INIディクショナリ
+ /// 開始日
+ /// 0:OK、-1:NG
+ private static int RunOneFile(
+ string sectionName,
+ string path,
+ DateTime now,
+ List checkItems,
+ Dictionary iniDic,
+ DateTime fromDate,
+ List weOrderList)
+ {
+ // INIキー定義
+ const string KEY_INCLUDED_SHEET_NAMES = "IncludedSheetNames";
+ const string KEY_EXCLUDED_SHEET_NAMES = "ExcludedSheetNames";
+ const string KEY_INCLUDED_LINE_NAMES = "IncludedLineNames";
+ const string KEY_EXCLUDED_LINE_NAMES = "ExcludedLineNames";
+ const string KEY_EXCEL_SKIP_SAME_MONTH_SHEETS = "ExcelSkipSameMonthSheets";
+
+ if (System.IO.Path.GetExtension(path).ToLower() != ".xlsx" &&
+ System.IO.Path.GetExtension(path).ToLower() != ".xlsm")
+ {
+ LoggerUxer.Warn($"拡張子が異なるためスキップします。[{path}]");
+ return (int)Common.RetCode.Success;
+ }
+
+ LoggerUxer.Info($"[ファイル:{path}]");
+
+ try
+ {
+ using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
+ using (var book = new XLWorkbook(fs))
+ {
+ // 処理対象のシート名
+ var incSheetsCsv = DictionaryUxer.GetValueOrDefault(iniDic, KEY_INCLUDED_SHEET_NAMES, string.Empty);
+ if (!string.IsNullOrEmpty(incSheetsCsv))
+ {
+ LoggerUxer.Info($"[処理対象シート名:{incSheetsCsv}]");
+ }
+ else
+ {
+ LoggerUxer.Info($"[処理対象シート名:なし]");
+ }
+
+ // 処理対象外のシート名
+ var excSheetsCsv = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCLUDED_SHEET_NAMES, string.Empty);
+ if (!string.IsNullOrEmpty(excSheetsCsv))
+ {
+ if (string.IsNullOrEmpty(incSheetsCsv))
+ {
+ LoggerUxer.Info($"[処理対象外シート名:{excSheetsCsv}]");
+ }
+ else
+ {
+ LoggerUxer.Warn($"処理対象シート名が指定されているため、処理対象外指定は無効になります。[キー:{KEY_EXCLUDED_SHEET_NAMES},値:{excSheetsCsv}]");
+ }
+ }
+ else
+ {
+ LoggerUxer.Info($"[処理対象外シート名:なし]");
+ }
+ // シートフィルタ作成
+ var incSheets = string.IsNullOrEmpty(incSheetsCsv) ? new string[] { } : incSheetsCsv.Split(',');
+ var excSheets = string.IsNullOrEmpty(excSheetsCsv) ? new string[] { } : excSheetsCsv.Split(',');
+ var sheetFilter = new SheetFilterUxer(incSheets, excSheets);
+
+ // 処理対象のライン名
+ var incLinesCsv = DictionaryUxer.GetValueOrDefault(iniDic, KEY_INCLUDED_LINE_NAMES, string.Empty);
+ if (!string.IsNullOrEmpty(incLinesCsv))
+ {
+ LoggerUxer.Info($"[処理対象ライン名:{incLinesCsv}]");
+ }
+ else
+ {
+ LoggerUxer.Info($"[処理対象ライン名:なし]");
+ }
+
+ // 処理対象外のライン名
+ var excLinesCsv = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCLUDED_LINE_NAMES, string.Empty);
+ if (!string.IsNullOrEmpty(excLinesCsv))
+ {
+ if (string.IsNullOrEmpty(incLinesCsv))
+ {
+ LoggerUxer.Info($"[処理対象外ライン名:{excLinesCsv}]");
+ }
+ else
+ {
+ LoggerUxer.Warn($"処理対象ライン名が指定されているため、処理対象外指定は無効になります。[キー:{KEY_EXCLUDED_LINE_NAMES},値:{excLinesCsv}]");
+ }
+ }
+ else
+ {
+ LoggerUxer.Info($"[処理対象外ライン名:なし]");
+ }
+ // ラインフィルタ作成
+ var incLines = string.IsNullOrEmpty(incLinesCsv) ? new string[] { } : incLinesCsv.Split(',');
+ for (int cnt = 0; cnt < incLines.Count(); cnt++) incLines[cnt] = incLines[cnt].Replace("@@@COMMA@@@", ",");
+ var excLines = string.IsNullOrEmpty(excLinesCsv) ? new string[] { } : excLinesCsv.Split(',');
+ for (int cnt = 0; cnt < excLines.Count(); cnt++) excLines[cnt] = excLines[cnt].Replace("@@@COMMA@@@", ",");
+ var lineFilter = new LineFilterUxer(incLines, excLines);
+
+ // 同月シートスキップ
+ var skipSameMonthSheets = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_SKIP_SAME_MONTH_SHEETS, string.Empty);
+ if (string.IsNullOrEmpty(skipSameMonthSheets))
+ {
+ LoggerUxer.Error($"設定ファイルの同月シートスキップ有無が未指定です。[キー:{KEY_EXCEL_SKIP_SAME_MONTH_SHEETS}]");
+ return (int)Common.RetCode.ConfigError;
+ }
+ if (!bool.TryParse(skipSameMonthSheets.ToLower(),out var isSkipSameMonth))
+ {
+ LoggerUxer.Error($"設定ファイルの同月シートスキップ有無が不正値です。[{KEY_EXCEL_SKIP_SAME_MONTH_SHEETS}:{skipSameMonthSheets}]");
+ return (int)Common.RetCode.ConfigError;
+ }
+ LoggerUxer.Info($"[同月シートスキップ有無:{isSkipSameMonth.ToString().ToLower()}]");
+
+ // シートの年月保持
+ var yyyymmList = new List();
+
+ // シート右端から左へループ
+ for (int sheetIndex = book.Worksheets.Count; sheetIndex >= 1; sheetIndex--)
+ {
+ // シート取得
+ var sheet = book.Worksheet(sheetIndex);
+
+ if (!sheetFilter.CanPass(sheet.Name.Trim()))
+ {
+ // シート名フィルタに引っかからなかった時、飛ばす
+ LoggerUxer.Info($"対象外のシートをスキップします。[シート名:{sheet.Name}]");
+ continue;
+ }
+
+ // 条件を満たさないシートは飛ばす
+ if (CheckExcelSheet(sheet, checkItems) == false)
+ {
+ LoggerUxer.Info($"シート条件を満たさないためスキップします。[シート名:{sheet.Name}]");
+ continue;
+ }
+
+ LoggerUxer.Info($"[シート名:{sheet.Name}]");
+
+ // ライン(先頭のみ)情報取得
+ if (!TryCreateLineInfoList(sheet, iniDic, lineFilter, out var lineInfoList, true))
+ {
+ return (int)Common.RetCode.ExcelLinesInfoGetError;
+ }
+
+ var lineNames = lineInfoList.Select(x => x.LineName).Distinct();
+ if (!lineFilter.HasAnyPass(lineNames))
+ {
+ LoggerUxer.Info($"シート内に対象のラインがないためスキップします。");
+ continue;
+ }
+
+ // 日付情報取得
+ if (!GetDateList(sheet, fromDate, null, iniDic, out var dateDic))
+ {
+ return (int)Common.RetCode.ExcelDateCellGetError;
+ }
+
+ if (isSkipSameMonth)
+ {
+ var yyyymm = dateDic.Values.Max().ToString("yyyyMM");
+ if (yyyymmList.Contains(yyyymm))
+ {
+ LoggerUxer.Info($"シートの年月が既に処理済みのため、このシートをスキップします。[シート名:{sheet.Name.Trim()},年月:{yyyymm.Substring(0, 4) + "年" + yyyymm.Substring(4, 2) + "月"}]");
+ continue;
+ }
+ yyyymmList.Add(yyyymm);
+ }
+
+ // 最大日が開始日より小さい場合、シートを飛ばす
+ if (dateDic.Values.Max() < fromDate)
+ {
+ LoggerUxer.Info($"シート最大日が開始日より前のためスキップします。[シート最大日:{(DateTime)(dateDic.Values.Max()):yyyy/MM/dd}]");
+ continue;
+ }
+
+ // ライン繰り返し
+ foreach (var line in lineInfoList)
+ {
+ // データ取得
+ if (!GetData(sheet, line, now, dateDic, fromDate, iniDic, weOrderList))
+ {
+ return (int)Common.RetCode.ExcelDataGetError;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LoggerUxer.Error($"1ファイル処理にてエラーが発生しました。[{ex.Message}]");
+ return (int)Common.RetCode.ExcelOneFileException;
+ }
+ return (int)Common.RetCode.Success;
+ }
+
+ ///
+ /// Excel対象シートチェック項目をINIファイルより取得
+ ///
+ /// INIのチェック項目文字列
+ /// チェック項目のリスト
+ private static bool TryGetExcelSheetCheckItemsFromIni(string checkItems, out List resultList)
+ {
+ resultList = new List();
+
+ if (string.IsNullOrEmpty(checkItems)) return true;
+
+ var items = checkItems.Split('|');
+
+ foreach (var item in items)
+ {
+ var strs = item.Split(',');
+ if (strs.Length != 2)
+ {
+ LoggerUxer.Error($"Excel対象シートチェック項目にカンマの数が不正な箇所がありました。[全条件文字列:{checkItems},カンマ数:{strs.Length}]");
+ return false;
+ }
+
+ // A1形式セルアドレス(複数あり)
+ var a1AddressList = strs[0]
+ .Split(new string[] { ExcelSheetCheckDto.OR_DELIMITER }, StringSplitOptions.None)
+ .ToList();
+ for (var cnt = 0; cnt < a1AddressList.Count; cnt++)
+ {
+ if (!XlUxer.TryValidateA1CellAddress(a1AddressList[cnt], out var resultAddress))
+ {
+ LoggerUxer.Error($"A1形式アドレス値が不正です。[アドレス値:{a1AddressList[cnt]},チェック項目文字列:{checkItems}]");
+ return false;
+ }
+ a1AddressList[cnt] = resultAddress;
+ }
+
+ // チェック値(複数あり)
+ var checkValuesList = strs[1]
+ .Split(new string[] { ExcelSheetCheckDto.OR_DELIMITER }, StringSplitOptions.None)
+ .ToList();
+
+ resultList.Add(new ExcelSheetCheckDto()
+ {
+ a1AddressList = a1AddressList,
+ CheckValueList = checkValuesList,
+ });
+ }
+ return true;
+ }
+
+ ///
+ /// Excelの対象シートチェック
+ ///
+ /// シート
+ /// チェック項目リスト
+ /// true:OK、false:NG
+ private static bool CheckExcelSheet(IXLWorksheet sheet, List checkItems)
+ {
+ // チェック項目(複数)が全てOKであること
+ foreach (var item in checkItems)
+ {
+ // セル(複数)とチェック値(複数)の組み合わせで1つでも一致すればOK
+ var isMatch = false;
+ foreach (var a1 in item.a1AddressList)
+ {
+ for (var cnt = 0; cnt < item.CheckValueList.Count; cnt++)
+ {
+ if (!KanaConvertUxer.TryConvertHankakuToZenkaku(item.CheckValueList[cnt], out var resultForMe, out var messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ return false;
+ }
+ var checkValue = resultForMe;
+
+ if (!KanaConvertUxer.TryConvertHankakuToZenkaku(XlUxer.GCell(sheet, a1).GetFormattedString(), out resultForMe, out messageForMe))
+ {
+ LoggerUxer.Error(messageForMe);
+ return false;
+ }
+ var cellValue = resultForMe;
+
+ if (StringUxer.WildcardMatch(cellValue, checkValue))
+ {
+ isMatch = true;
+ break;
+ }
+ }
+ if (isMatch) break;
+ }
+ if (!isMatch)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ ///
+ /// 日付情報取得
+ ///
+ /// シート
+ /// INIDIC
+ /// 日付辞書(キーは列番号)
+ /// 成否
+ private static bool GetDateList(
+ IXLWorksheet sheet,
+ DateTime fromDate,
+ DateTime? toDate,
+ Dictionary iniDic,
+ out Dictionary dateDic)
+ {
+ // INIキー定義
+ const string KEY_EXCEL_DATE_ROW_MODE = "ExcelDateRowMode";
+ const string EXCEL_DATE_ROW_MODE_FIXED = "Fixed";
+ const string EXCEL_DATE_ROW_MODE_JUDGE = "Judge";
+ const string EXCEL_DATE_ROW_MODE_NONE = "None";
+ const string KEY_EXCEL_DATE_ROW = "ExcelDateRow";
+ const string KEY_EXCEL_DATE_ROW_JUDGE_COL = "ExcelDateRowJudgeCol";
+ const string KEY_EXCEL_DATE_ROW_JUDGE_VALUE = "ExcelDateRowJudgeValue";
+ const string KEY_EXCEL_DATE_ROW_START_COL = "ExcelDateRowStartCol";
+ const string KEY_EXCEL_DATE_ROW_END_VALUE = "ExcelDateRowEndValue";
+ const string KEY_EXCEL_DATE_YM_GET_MODE = "ExcelDateYMGetMode";
+ const string KEY_EXCEL_NEN_GETSU_CELL_ADDRESS = "ExcelNenGetsuCellAddress";
+ const string KEY_EXCEL_DATE_YEAR_CELL = "ExcelDateYearCell";
+ const string KEY_EXCEL_DATE_MONTH_CELL = "ExcelDateMonthCell";
+
+ dateDic = new Dictionary();
+ var dayDic = new Dictionary();
+
+ DateTime? dateNenGetsu = null;
+
+ var strExcelDateRowMode = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_ROW_MODE, string.Empty);
+ if (string.IsNullOrEmpty(strExcelDateRowMode))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行指定モードが未設定です。[キー:{KEY_EXCEL_DATE_ROW_MODE}]");
+ return false;
+ }
+ if (strExcelDateRowMode.ToLower() != EXCEL_DATE_ROW_MODE_FIXED.ToLower() &&
+ strExcelDateRowMode.ToLower() != EXCEL_DATE_ROW_MODE_JUDGE.ToLower() &&
+ strExcelDateRowMode.ToLower() != EXCEL_DATE_ROW_MODE_NONE.ToLower())
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行指定モードが不正値です。[{KEY_EXCEL_DATE_ROW_MODE}:{strExcelDateRowMode}]");
+ return false;
+ }
+
+ var excelDateRow = int.MinValue;
+
+ if (strExcelDateRowMode.ToLower() == EXCEL_DATE_ROW_MODE_FIXED.ToLower())
+ {
+ // 日付行指定モードが固定値の場合
+ var str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_ROW, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行番号が未設定です。[キー:{KEY_EXCEL_DATE_ROW}]");
+ return false;
+ }
+ if (int.TryParse(str, out excelDateRow) == false || excelDateRow <= 0)
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行番号が不正値です。[{KEY_EXCEL_DATE_ROW}:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[日付行番号(設定ファイル値):{excelDateRow}]");
+ }
+ else if (strExcelDateRowMode.ToLower() == EXCEL_DATE_ROW_MODE_JUDGE.ToLower())
+ {
+ // 日付行指定モードが判定の場合
+
+ // 日付行判定列
+ var strJudgeCol = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_ROW_JUDGE_COL, string.Empty);
+ if (string.IsNullOrEmpty(strJudgeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行判定列が未設定です。[キー:{KEY_EXCEL_DATE_ROW_JUDGE_COL}]");
+ return false;
+ }
+ if (!XlUxer.TryConvertColLetterToNumber(strJudgeCol, out var colNo))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行判定列が不正値です。[{KEY_EXCEL_DATE_ROW_JUDGE_COL}:{strJudgeCol}]");
+ return false;
+ }
+ LoggerUxer.Info($"[日付行判定列:{strJudgeCol}(番号:{colNo})]");
+
+ // 日付行判定値
+ var strJudgeValue = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_ROW_JUDGE_VALUE, string.Empty);
+
+ // 日付行の検索
+ for (int row = 1; row <= 1000; row++)
+ {
+ var cellValue = sheet.Cell(row, colNo).GetFormattedString();
+ if (cellValue == strJudgeValue)
+ {
+ // 日付行検出
+ excelDateRow = row;
+ break;
+ }
+ }
+ if (excelDateRow == int.MinValue)
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行判定が失敗しました。[{KEY_EXCEL_DATE_ROW_JUDGE_COL}:{strJudgeCol},{KEY_EXCEL_DATE_ROW_JUDGE_VALUE}:{strJudgeValue}]");
+ return false;
+ }
+ LoggerUxer.Info($"[日付行番号(判定結果):{excelDateRow}]");
+ }
+ else if (strExcelDateRowMode.ToLower() == EXCEL_DATE_ROW_MODE_NONE.ToLower())
+ {
+ // 日付行指定モードがなしの場合
+ LoggerUxer.Info($"日付行なし[{KEY_EXCEL_DATE_ROW_MODE}:{strExcelDateRowMode}]");
+ return true;
+ }
+ else
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行指定モードの扱いに失敗しました。[{KEY_EXCEL_DATE_ROW_MODE}:{strExcelDateRowMode}]");
+ return false;
+ }
+
+ if (sheet.Row(excelDateRow).IsHidden)
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付行番号が非表示行です。[日付行番号:{excelDateRow}]");
+ return false;
+ }
+
+ // 年と月の取得モード
+ var strYMGetMode = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_YM_GET_MODE, string.Empty);
+ if (string.IsNullOrEmpty(strYMGetMode))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年/月取得モードが未設定です。[キー:{KEY_EXCEL_DATE_YM_GET_MODE}]");
+ return false;
+ }
+ // enum値変換
+ ENUM_EXCEL_DATE_YM_GET_MODE ymGetMode = GetExcelDateYMGetModeFromIniValue(strYMGetMode);
+ if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.None)
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年/月取得モードが不正値です。[{KEY_EXCEL_DATE_YM_GET_MODE}:{strYMGetMode}]");
+ return false;
+ }
+
+ if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromTargetCellDate)
+ {
+ // 特定セル値から取得する場合、ここで取得しておく
+ var strAddress = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_NEN_GETSU_CELL_ADDRESS, string.Empty);
+ if (string.IsNullOrEmpty(strAddress))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年月セルアドレスが未設定です。[キー名:{KEY_EXCEL_NEN_GETSU_CELL_ADDRESS}]");
+ return false;
+ }
+ if (!ExcelCellValidatorUxer.IsValidA1Format(strAddress))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年月セルアドレスが不正値です。[{KEY_EXCEL_NEN_GETSU_CELL_ADDRESS}:{strAddress}]");
+ return false;
+ }
+ var cellText = sheet.Cell(strAddress).GetFormattedString().Trim();
+ if (!TryGetYmFromText(cellText, out dateNenGetsu))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年月セルアドレス値に年月が含まれません。[{KEY_EXCEL_NEN_GETSU_CELL_ADDRESS}:{strAddress}]");
+ return false;
+ }
+ }
+
+ int intYYYY = int.MinValue;
+ int intMM = int.MinValue;
+ if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromYMCells)
+ {
+ // 年月を年月セルから取得する場合
+
+ // 年セル
+ var str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_YEAR_CELL, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年セルが未設定です。[キー:{KEY_EXCEL_DATE_YEAR_CELL}]");
+ return false;
+ }
+ var str2 = str.Trim().ToUpper();
+ if (!ExcelCellValidatorUxer.IsValidA1Format(str2))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年セルがA1形式として不正値です。[{KEY_EXCEL_DATE_YEAR_CELL}:{str}]");
+ return false;
+ }
+
+ // 見たままのテキスト値を取得
+ // 空チェック
+ str = sheet.Cell(str2).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"年セルが未設定です。[セルアドレス:{str2}]");
+ return false;
+ }
+ // 数値と範囲チェック
+ if (int.TryParse(str, out var intYear) == false)
+ {
+ LoggerUxer.Error($"年セルが非数値です。[セルアドレス:{str2},セル値:{str}]");
+ return false;
+ }
+ if (intYear < 0)
+ {
+ // エラー
+ }
+ else if (intYear <= 99)
+ {
+ // 年2桁を4桁化
+ intYYYY = 2000 + intYear;
+ }
+ else if(intYear < 2000)
+ {
+ // エラー
+ }
+ else if(intYear < 3000)
+ {
+ // 年4桁はそのまま
+ intYYYY = intYear;
+ }
+ else
+ {
+ // エラー
+ }
+ if (intYYYY == int.MinValue)
+ {
+ LoggerUxer.Error($"年セルが範囲外です。[セルアドレス:{str2},セル値:{intYear}]");
+ return false;
+ }
+ LoggerUxer.Info($"[シートの年:{intYYYY}]");
+
+ // 月セル
+ str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_MONTH_CELL, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel月セルが未設定です。[キー:{KEY_EXCEL_DATE_MONTH_CELL}]");
+ return false;
+ }
+ str2 = str.Trim().ToUpper();
+ if (!ExcelCellValidatorUxer.IsValidA1Format(str2))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel月セルがA1形式として不正値です。[{KEY_EXCEL_DATE_MONTH_CELL}:{str}]");
+ return false;
+ }
+
+ // 見たままのテキスト値を取得
+ // 空チェック
+ str = sheet.Cell(str2).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"月セルが未設定です。[セルアドレス:{str2}]");
+ return false;
+ }
+ // 数値と範囲チェック
+ if (int.TryParse(str, out var intMonth) == false)
+ {
+ LoggerUxer.Error($"月セルが非数値です。[セルアドレス:{str2},セル値:{str}]");
+ return false;
+ }
+ if (intMonth < 1)
+ {
+ // エラー
+ }
+ else if (intMonth <= 12)
+ {
+ // OK
+ intMM = intMonth;
+ }
+ else
+ {
+ // エラー
+ }
+ if (intMM == int.MinValue)
+ {
+ LoggerUxer.Error($"月セルが範囲外です。[セルアドレス:{str2},セル値:{intMonth}]");
+ return false;
+ }
+ LoggerUxer.Info($"[シートの月:{intMM}]");
+ }
+
+ if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromSheetName)
+ {
+ // シート名から取得
+ var sheetName = sheet.Name.Trim();
+ if (!GetYMFrom2Numerics(sheetName, out intYYYY, out intMM, out var messageForMe))
+ {
+ LoggerUxer.Error($"シート名から年月を取得できませんでした。[シート名:{sheetName}, 詳細:{messageForMe}]");
+ return false;
+ }
+ }
+
+ var strExcelDateStartCol = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_ROW_START_COL, string.Empty);
+
+ //if (int.TryParse(strExcelDateStartCol, out var excelDateStartCol) == false || excelDateStartCol < 0)
+ if (!XlUxer.TryConvertColLetterToNumber(strExcelDateStartCol, out int excelDateStartCol))
+ {
+ LoggerUxer.Error($"設定ファイルのExcel日付開始列が不正です。[{KEY_EXCEL_DATE_ROW_START_COL}:{strExcelDateStartCol}]");
+ return false;
+ }
+ LoggerUxer.Info($"[日付開始列:{strExcelDateStartCol}(番号:{excelDateStartCol})]");
+
+ var strExcelDateRowEndValue = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATE_ROW_END_VALUE, string.Empty);
+
+ // 日付開始セルから繰り返す
+ for (int col = excelDateStartCol; ; col++)
+ {
+ if (col > 1000)
+ {
+ // 終了値が見つからない
+ LoggerUxer.Error($"日付行で終了値が見つかりません。[日付行:{excelDateRow},日付行開始列:{strExcelDateStartCol},日付終了値:{strExcelDateRowEndValue}]");
+ return false;
+ }
+
+ // 非表示列は飛ばす
+ if (sheet.Column(col).IsHidden) continue;
+
+ // 日付列終了
+ if (sheet.Cell(excelDateRow, col).GetFormattedString() == strExcelDateRowEndValue) break;
+
+ DateTime date = DateTime.MinValue;
+
+ if (dateNenGetsu != null)
+ {
+ var dt = (DateTime)dateNenGetsu;
+ var text = sheet.Cell(excelDateRow, col).GetFormattedString().Trim();
+ if (!int.TryParse(text,out var intVal))
+ {
+ // 数値でないとき飛ばす
+ continue;
+ }
+ date = new DateTime(dt.Year, dt.Month, intVal);
+ // ディクショナリに追加
+ dateDic.Add(col, date);
+ }
+ else if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromDateCell)
+ {
+ // 年月を日付値から取得する場合
+
+ if (sheet.Cell(excelDateRow, col).TryGetValue(out var d) &&
+ d.Year >= 2000)
+ {
+ // 日付型で取得できたらそのままリストに追加
+ date = d;
+ }
+ else if (int.TryParse(sheet.Cell(excelDateRow, col).GetFormattedString(), out var intValue) &&
+ intValue >= 1 && intValue <= 31)
+ {
+ // 日のみ数値で格納されている
+
+ if (dateDic.Count == 0)
+ {
+ // 最初のセルが日付でない場合飛ばす
+ LoggerUxer.Warn($"日付行の開始セルが日付ではありません。[日付行:{excelDateRow},列:{col},値:{sheet.Cell(excelDateRow, col).GetFormattedString()}]");
+ continue;
+ }
+ // 直前の日付の年と月を使用して日付を作る
+ date = new DateTime(
+ dateDic[dateDic.Keys.Max()].Year,
+ dateDic[dateDic.Keys.Max()].Month,
+ intValue);
+ }
+ else if (sheet.Cell(excelDateRow, col).TryGetValue(out d))
+ {
+ // 日付型で年が2000未満のとき、
+ if (dateDic.Count > 0 && d.Month == dateDic[dateDic.Max(m => m.Key)].Month)
+ {
+ d = new DateTime(
+ dateDic[dateDic.Max(m => m.Key)].Year,
+ d.Month,
+ d.Day);
+ }
+ else if (dateDic.Count > 0)
+ {
+ d = new DateTime(
+ dateDic[dateDic.Max(m => m.Key)].Month == 12 ?
+ dateDic[dateDic.Max(m => m.Key)].Year + 1 :
+ dateDic[dateDic.Max(m => m.Key)].Year,
+ d.Month,
+ d.Day);
+ }
+ else
+ {
+ LoggerUxer.Warn($"日付セルの年が不明です。[日付行:{excelDateRow},列:{col}]");
+ continue;
+ }
+ date = d;
+ }
+ else
+ {
+ // 日付でも数値でも無い場合、飛ばす
+ LoggerUxer.Warn($"日付セルが日付または数値ではありません。[日付行:{excelDateRow},列:{col}]");
+ continue;
+ }
+ if (dateDic.Count > 0 && date <= dateDic.Values.Max(m => m))
+ {
+ // 前の日付より昔の日付の場合、飛ばす
+ LoggerUxer.Warn($"日付行のセルの日付が重複または逆転しています。[日付行:{excelDateRow},列:{col},値:{sheet.Cell(excelDateRow, col).GetFormattedString()}]");
+ continue;
+ }
+ if (toDate != null && (date < fromDate || date > (DateTime)toDate))
+ {
+ // 終了日指定ありで、開始から終了の範囲外のとき、飛ばす
+ continue;
+ }
+
+ // ディクショナリに追加
+ dateDic.Add(col, date);
+ }
+ else if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromYMCells)
+ {
+ // 年月を年月セルから取得する場合
+
+ // 表示されているままの文字列(通常日のみ)を取得
+ var str = sheet.Cell(excelDateRow, col).GetFormattedString().Trim();
+
+ if (string.IsNullOrEmpty(str) || int.TryParse(str, out var day) == false || day < 1)
+ {
+ // 空または数値でない、またはマイナス値の場合、飛ばす
+ LoggerUxer.Warn($"日付セルが数値ではありません。[日付行:{excelDateRow},列:{ExcelColumnHelperUxer.GetExcelColumnLetter(col)}(番号:{col}),値:{str}]");
+ continue;
+ }
+
+ // 日のみDicに追加
+ dayDic.Add(col, day);
+ }
+ else if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromSheetName)
+ {
+ // 年月をシート名から取得する場合
+
+ // 表示されているままの文字列(通常日のみ)を取得
+ var str = sheet.Cell(excelDateRow, col).GetFormattedString().Trim();
+
+ if (string.IsNullOrEmpty(str) || int.TryParse(str, out var day) == false || day < 1)
+ {
+ // 空または数値でない、またはマイナス値の場合、飛ばす
+ LoggerUxer.Warn($"日付セルが数値ではありません。[日付行:{excelDateRow},列:{ExcelColumnHelperUxer.GetExcelColumnLetter(col)}(番号:{col}),値:{str}]");
+ continue;
+ }
+
+ // 日のみDicに追加
+ dayDic.Add(col, day);
+ }
+ else
+ {
+ LoggerUxer.Error($"設定ファイルのExcel年/月取得モードが不正値です。[{KEY_EXCEL_DATE_YM_GET_MODE}:{strYMGetMode}]");
+ return false;
+ }
+ }
+ if ((ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromDateCell && dateDic.Count == 0) ||
+ (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromYMCells && dayDic.Count == 0))
+ {
+ // 日付なし
+ LoggerUxer.Error($"Excelの日付行情報が取得できませんでした。[日付行:{excelDateRow},日付開始列:{strExcelDateStartCol},日付終了値:{strExcelDateRowEndValue}]");
+ return false;
+ }
+
+ if (ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromYMCells ||
+ ymGetMode == ENUM_EXCEL_DATE_YM_GET_MODE.FromSheetName)
+ {
+ int maeDay = int.MinValue;
+ bool isTochuDown = false;
+ foreach (var col in dayDic.Keys)
+ {
+ if (dayDic[col] < maeDay)
+ {
+ isTochuDown = true;
+ break;
+ }
+ maeDay = dayDic[col];
+ }
+ if (isTochuDown)
+ {
+ // 二月跨っている
+ var maeYear = intMM == 1 ? intYYYY - 1 : intYYYY;
+ var maeMonth = intMM == 1 ? 12 : intMM - 1;
+ var isMae = true;
+ dateDic.Clear();
+ maeDay = int.MinValue;
+ foreach (var col in dayDic.Keys)
+ {
+ if (isMae && (dayDic[col] < maeDay))
+ {
+ isMae = false;
+ }
+ if (isMae)
+ dateDic.Add(col, new DateTime(maeYear, maeMonth, dayDic[col]));
+ else
+ dateDic.Add(col, new DateTime(intYYYY, intMM, dayDic[col]));
+ maeDay = dayDic[col];
+ }
+ }
+ else
+ {
+ // 1月のみ
+ dateDic.Clear();
+ foreach (var col in dayDic.Keys)
+ {
+ dateDic.Add(col, new DateTime(intYYYY, intMM, dayDic[col]));
+ }
+ }
+ }
+
+ // 年月補正
+ UpdateYearMonth(dateDic);
+
+ // シート名から年補正
+ if (StringUxer.TryExtractYearFromString(sheet.Name, out var yearFromSheetName))
+ {
+ var oldYear = dateDic[dateDic.Max(m => m.Key)].Year;
+ var sa = yearFromSheetName - oldYear;
+ if (sa != 0)
+ {
+ var keys = dateDic.Keys.ToList();
+ foreach (var key in keys)
+ {
+ dateDic[key] = new DateTime(
+ dateDic[key].Year + sa,
+ dateDic[key].Month,
+ dateDic[key].Day);
+ }
+ LoggerUxer.Info($"シート名より日付の年を補正しました。[補正前:{oldYear},補正後:{yearFromSheetName}]");
+ }
+ }
+
+ LoggerUxer.Info($"[日付:{GetDatesString(dateDic)}]");
+ return true;
+ }
+
+ ///
+ /// 文字列から年月を取得
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static bool GetYMFrom2Numerics(
+ string inputText,
+ out int year,
+ out int month,
+ out string resultMessage)
+ {
+ year = -1;
+ month = -1;
+ resultMessage = string.Empty;
+
+ // 1. 数字の塊を抽出
+ MatchCollection matches = Regex.Matches(inputText, @"\d+");
+ if (matches.Count < 2)
+ {
+ resultMessage = "数字が2つ以上含まれていません。";
+ return false;
+ }
+
+ // 先頭の2つを取得
+ string rawYearOrTerm = matches[0].Value;
+ string rawMonth = matches[1].Value;
+
+ // 数値に変換
+ int yearOrTerm = int.Parse(rawYearOrTerm);
+ month = int.Parse(rawMonth);
+
+ // 2. 2個目の数字(月)のチェック
+ if (month < 1 || month > 12)
+ {
+ resultMessage = $"月の値({month})が1~12の範囲外です。";
+ return false;
+ }
+
+ bool isTerm = false;
+
+ // 3. 1個目の数字(年・期)の変換
+ if (rawYearOrTerm.Length == 4)
+ {
+ year = yearOrTerm; // 4桁はそのまま西暦
+ }
+ else if (rawYearOrTerm.Length == 2)
+ {
+ year = yearOrTerm + 2000; // 2桁は2000を足す
+ }
+ else if (rawYearOrTerm.Length == 3) // ★将来「99期」などがあるなら「期フラグ」を紐付けるのが安全です
+ {
+ year = yearOrTerm + 1923; // 3桁は期(1923を足す)
+ isTerm = true;
+ }
+ else
+ {
+ resultMessage = $"1つ目の数字({rawYearOrTerm})の桁数が不正です。";
+ return false;
+ }
+
+ // 4. 期のときの年度補正(1~3月のときは西暦に1足す)
+ if (isTerm && (month >= 1 && month <= 3))
+ {
+ year += 1;
+ }
+
+ // 念のため
+ if (year > DateTime.Today.Year + 1)
+ {
+ resultMessage = $"年({year})が不正です。";
+ return false;
+ }
+ return true;
+ }
+
+ ///
+ /// INI値から日付並び年月取得モードenum値を取得
+ ///
+ /// INI値(文字列)
+ /// enum値(該当なしはNone)
+ private static ENUM_EXCEL_DATE_YM_GET_MODE GetExcelDateYMGetModeFromIniValue(string iniValue)
+ {
+ ENUM_EXCEL_DATE_YM_GET_MODE ret = ENUM_EXCEL_DATE_YM_GET_MODE.None;
+ if (iniValue.ToLower() == KEY_EXCEL_DATE_YM_GET_MODE_FROM_YM_CELLS.ToLower())
+ {
+ ret = ENUM_EXCEL_DATE_YM_GET_MODE.FromYMCells;
+ }
+ else if (iniValue.ToLower() == KEY_EXCEL_DATE_YM_GET_MODE_FROM_DATE_CELL.ToLower())
+ {
+ ret = ENUM_EXCEL_DATE_YM_GET_MODE.FromDateCell;
+ }
+ else if (iniValue.ToLower() == KEY_EXCEL_DATE_YM_GET_MODE_FROM_TARGET_CELL_DATE.ToLower())
+ {
+ ret = ENUM_EXCEL_DATE_YM_GET_MODE.FromTargetCellDate;
+ }
+ else if (iniValue.ToLower() == KEY_EXCEL_DATE_YM_GET_MODE_FROM_SHEET_NAME.ToLower())
+ {
+ ret = ENUM_EXCEL_DATE_YM_GET_MODE.FromSheetName;
+ }
+ return ret;
+ }
+
+ private static void UpdateYearMonth(Dictionary dicDate)
+ {
+ // 更新前の日付文字列
+ string before = GetDatesString(dicDate);
+
+ // 年月(yyyyMM)でグループ化
+ var ymGroups = dicDate.Values
+ .Select(dt => dt.Date)
+ .GroupBy(dt => dt.Year * 100 + dt.Month)
+ .OrderBy(g => g.Key)
+ .ToList();
+
+ if (ymGroups.Count == 2)
+ {
+ var firstYm = ymGroups[0].Key;
+ var secondYm = ymGroups[1].Key;
+
+ // secondYmの1月前を計算
+ var expectedYm = (secondYm % 100 == 1)
+ ? (secondYm / 100 - 1) * 100 + 12
+ : secondYm - 1;
+
+ if (firstYm != expectedYm)
+ {
+ // 更新対象の年月
+ var newDate = new DateTime(expectedYm / 100, expectedYm % 100, 1);
+
+ foreach (var key in dicDate.Keys.ToList())
+ {
+ var dt = dicDate[key];
+ if (dt.Year * 100 + dt.Month == firstYm)
+ {
+ // 日付はそのまま、年月だけ更新
+ dicDate[key] = new DateTime(newDate.Year, newDate.Month, dt.Day);
+ }
+ }
+ LoggerUxer.Info($"前の年月を {expectedYm} に補正[補正前:{before}][補正後:{GetDatesString(dicDate)}]");
+ }
+ }
+ }
+
+ private static string GetDatesString(Dictionary dic)
+ {
+ string str = string.Empty;
+ int maeYyyy = -1;
+ int maeMm = -1;
+ foreach (var day in dic.Values.OrderBy(m => m))
+ {
+ if (string.IsNullOrEmpty(str))
+ {
+ str = day.ToString("yyyy/M/d");
+ maeYyyy = day.Year;
+ maeMm = day.Month;
+ continue;
+ }
+ str += ",";
+ if (day.Year==maeYyyy&&day.Month==maeMm)
+ {
+ str += day.Day.ToString();
+ }
+ else if(day.Year == maeYyyy)
+ {
+ str += day.Month.ToString()+"/" +day.Day.ToString();
+ }
+ else
+ {
+ str += day.ToString("yyyy/M/d");
+ }
+ maeYyyy = day.Year;
+ maeMm = day.Month;
+ }
+ return str;
+ }
+
+ // ライン(複数)情報取得
+ private static bool TryCreateLineInfoList(
+ IXLWorksheet sheet,
+ Dictionary iniDic,
+ LineFilterUxer lineFilter,
+ out List lineInfoList,
+ bool isTopOnly = false)
+ {
+ const string KEY_NAME_TO_ID_LIST_FOR_LINE = "NameToIdListForLine";
+ const string KEY_EXCEL_LINE_JUDGE_COL = "ExcelLineJudgeCol";
+ //const string LINE_LABEL = "ライン";
+ const string KEY_EXCEL_LINE_JUDGE_VALUE = "ExcelLineJudgeValue";
+ const string KEY_EXCEL_DATA_START_ROW_JUDGE_COL = "ExcelDataStartRowJudgeCol";
+ const string KEY_EXCEL_DATA_START_ROW_JUDGE_VALUES = "ExcelDataStartRowJudgeValues";
+ const string KEY_EXCEL_LINES_ON_SHEET = "ExcelLinesOnSheet";
+
+ // データ開始行判定値
+ List dataStartRowJudgeValues = new List();
+
+ lineInfoList = new List();
+
+ // 1シートに複数ラインあり
+ var linesInSheet = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_LINES_ON_SHEET, string.Empty) == "1";
+ LoggerUxer.Info($"[シート内に複数ライン:{linesInSheet}]");
+ isTopOnly = !linesInSheet;
+
+ // ライン判定値
+ var lineJudgeValue = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_LINE_JUDGE_VALUE, string.Empty);
+ if (string.IsNullOrEmpty(lineJudgeValue))
+ {
+ LoggerUxer.Error($"設定ファイルにライン判定値が設定されていません。[キー:{KEY_EXCEL_LINE_JUDGE_VALUE}]");
+ return false;
+ }
+ LoggerUxer.Info($"[ライン判定値:{lineJudgeValue}]");
+
+ // ライン名→ID変換辞書
+ if (!DictionaryUxer.CreateNameToIdDic(
+ DictionaryUxer.GetValueOrDefault(iniDic, KEY_NAME_TO_ID_LIST_FOR_LINE, string.Empty),
+ out var dicLine, out var myMessage))
+ {
+ LoggerUxer.Error($"ライン名→ID変換辞書の作成に失敗しました。[キー:{KEY_NAME_TO_ID_LIST_FOR_LINE},エラー内容:{myMessage}]");
+ return false;
+ }
+
+ var str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_LINE_JUDGE_COL, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルにライン判定列が設定されていません。[キー:{KEY_EXCEL_LINE_JUDGE_COL}]");
+ return false;
+ }
+ //if (!int.TryParse(str, out var lineJudgeCol) || lineJudgeCol < 1)
+ if (!XlUxer.TryConvertColLetterToNumber(str, out var lineJudgeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのライン判定列が不正です。[キー:{KEY_EXCEL_LINE_JUDGE_COL},値:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[ライン判定列:{str}(番号:{lineJudgeCol})]");
+
+ str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_START_ROW_JUDGE_COL, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルにデータ開始行判定列が設定されていません。[キー:{KEY_EXCEL_DATA_START_ROW_JUDGE_COL}]");
+ return false;
+ }
+ //if (!int.TryParse(str, out var dataStartRowJudgeCol) || dataStartRowJudgeCol < 1)
+ if (!XlUxer.TryConvertColLetterToNumber(str, out var dataStartRowJudgeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのデータ開始行判定列が不正です。[キー:{KEY_EXCEL_DATA_START_ROW_JUDGE_COL},値:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[データ開始行判定列:{str}(番号:{dataStartRowJudgeCol})]");
+
+ // データ開始行判定値
+ str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_START_ROW_JUDGE_VALUES, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルにデータ開始行判定値が設定されていません。[キー:{KEY_EXCEL_DATA_START_ROW_JUDGE_VALUES}]");
+ return false;
+ }
+ dataStartRowJudgeValues = str.Split(',').ToList();
+ LoggerUxer.Info($"[データ開始行判定値:{string.Join(",",dataStartRowJudgeValues.ToArray())}]");
+
+ // 1000行まで走査
+ for (var row = 1; row <= 1000; row++)
+ {
+ str = sheet.Cell(row, lineJudgeCol).GetFormattedString().Trim();
+ if (!KanaConvertUxer.TryConvertHankakuToZenkaku(str, out var cellValue, out var messageForMe))
+ {
+ LoggerUxer.Error($"ライン名の全角化に失敗しました。[エラー内容:{messageForMe}]");
+ return false;
+ }
+ if (cellValue == lineJudgeValue)
+ {
+ // ライン名(同列の1行下)
+ var lineName = sheet.Cell(row + 1, lineJudgeCol).GetFormattedString().Trim();
+
+ // 対象ライン以外は飛ばす
+ if (!lineFilter.CanPass(lineName.Trim()))
+ {
+ LoggerUxer.Info($"対象ライン以外をスキップします。[ライン名:{lineName}]");
+ continue;
+ }
+
+ var lineId = DictionaryUxer.GetValueOrDefault(dicLine, lineName.Replace(",", ""), int.MinValue);
+ if (lineId == int.MinValue)
+ {
+ lineId = DictionaryUxer.GetValueOrDefault(dicLine, lineName, int.MinValue);
+ }
+ if (lineId == int.MinValue)
+ {
+ LoggerUxer.Error($"ライン名が{KEY_NAME_TO_ID_LIST_FOR_LINE}に登録されていません。[ライン名:{lineName}]");
+ return false;
+ }
+ LoggerUxer.Info($"[ライン名:{lineName},ラインID:{lineId}]");
+
+ // 先頭ラインのみの場合、既に1件でもリストにあれば、ループ脱出(念のため)
+ if (isTopOnly && lineInfoList.Count > 0) break;
+
+ lineInfoList.Add(new ExcelLineDto()
+ {
+ LineId = lineId,
+ LineName = lineName,
+ ShiftName = sheet.Cell(row + 1, lineJudgeCol + 1).GetFormattedString().Trim(),
+ DataStartRow = 0,
+ LineCol = lineJudgeCol,
+ });
+ }
+
+ // データ開始行判定
+ var dataStartRowJudgeCell = sheet.Cell(row, dataStartRowJudgeCol).GetFormattedString().Trim();
+ if (!string.IsNullOrEmpty(dataStartRowJudgeCell) && dataStartRowJudgeValues.Contains(dataStartRowJudgeCell))
+ {
+ if (lineInfoList.Count > 0)
+ {
+ // データ開始行
+ var dataStartRow = row + 1;
+ if (string.IsNullOrEmpty(sheet.Cell(dataStartRow, dataStartRowJudgeCol).GetFormattedString().Trim()))
+ dataStartRow++;
+ lineInfoList.Last().DataStartRow = dataStartRow;
+ LoggerUxer.Info($"[データ開始行:{dataStartRow}]");
+
+ // 先頭ラインのみの場合、ループ脱出
+ if (isTopOnly) break;
+ }
+ }
+ }
+ if (lineInfoList.Count == 0)
+ {
+ // ラインなし
+ LoggerUxer.Warn($"ライン情報が見つかりませんでした。シートをスキップします。[シート名:{sheet.Name}]");
+ return true;
+ }
+
+ var noStartRowLine = lineInfoList.FirstOrDefault(m => m.DataStartRow == 0);
+ if (noStartRowLine != null)
+ {
+ // データ開始行が見つからなかったラインあり
+ LoggerUxer.Error($"開始行が見つからないラインがありました。[シート名:{sheet.Name},ライン名:{noStartRowLine.LineName}]");
+ return false;
+ }
+ return true;
+ }
+
+ // ファイルパスよりラインID取得
+ private static bool TryGetLineIdFromFilePath(
+ string filePath,
+ Dictionary iniDic,
+ out int lineId)
+ {
+ const string KEY_EXCEL_FILE_NAME_PATTERN_TO_LINE = "ExcelFileNamePatternToLine";
+
+ lineId = -1;
+
+ // ファイル名からライン判定
+ var fnptl = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_FILE_NAME_PATTERN_TO_LINE, string.Empty);
+ if (!string.IsNullOrEmpty(fnptl))
+ {
+ LoggerUxer.Info($"ファイル名からラインIDを取得します。[ファイルパス:{filePath}]");
+
+ var patterns = fnptl.Split('|');
+ foreach (var pattern in patterns)
+ {
+ var items = pattern.Split(',');
+ if (items.Length != 2)
+ {
+ LoggerUxer.Error(
+ $"ファイル名からライン判定のパターン定義が不正です。" +
+ $"[{KEY_EXCEL_FILE_NAME_PATTERN_TO_LINE}:{fnptl}]");
+ return false;
+ }
+ if (StringUxer.WildcardMatch(filePath, items[0]))
+ {
+ if (!int.TryParse(items[1].Trim(), out var intVal))
+ {
+ LoggerUxer.Error(
+ $"ファイル名からライン判定のパターン定義でラインIDが数値ではありません。" +
+ $"[{KEY_EXCEL_FILE_NAME_PATTERN_TO_LINE}:{fnptl}]");
+ return false;
+ }
+ lineId = intVal;
+ }
+ }
+ if (lineId == -1)
+ {
+ LoggerUxer.Error(
+ $"ファイル名からライン判定で合致するパターンがありませんでした。" +
+ $"[ファイル名:{filePath},{KEY_EXCEL_FILE_NAME_PATTERN_TO_LINE}:{fnptl}]");
+ return false;
+ }
+ return true;
+ }
+ LoggerUxer.Info($"ファイル名からラインIDは取得しません。[ファイルパス:{filePath}]");
+ return true;
+ }
+
+ // シート内のセルよりラインID取得
+ private static bool TryGetLineIdFromCell(
+ IXLWorksheet sheet,
+ Dictionary iniDic,
+ out int lineId)
+ {
+ const string KEY_EXCEL_LINE_KEY_CELL = "ExcelLineKeyCell";
+ const string KEY_EXCEL_LINE_KEY_VALUE_PAIR = "ExcelLineKeyValuePair";
+
+ lineId = -1;
+
+ var lineCell = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_LINE_KEY_CELL, string.Empty);
+ if (!string.IsNullOrEmpty(lineCell))
+ {
+ LoggerUxer.Info($"セル値からラインIDを取得します。[ラインID取得セル:{lineCell}]");
+
+ if (!XlUxer.TryValidateA1CellAddress(lineCell, out var _))
+ {
+ LoggerUxer.Error($"ライン取得セルアドレスが不正です。[{KEY_EXCEL_LINE_KEY_CELL}:{lineCell}]");
+ return false;
+ }
+
+ var lineConvStr = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_LINE_KEY_VALUE_PAIR, string.Empty);
+ if (string.IsNullOrEmpty(lineConvStr))
+ {
+ LoggerUxer.Info($"[ラインID取得なし]");
+ return true;
+ }
+ LoggerUxer.Info($"[ラインID取得セル:{lineCell}]");
+
+ // ライン判定値
+ var lineJudgeValue = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_LINE_KEY_VALUE_PAIR, string.Empty);
+ if (string.IsNullOrEmpty(lineJudgeValue))
+ {
+ LoggerUxer.Error($"設定ファイルにライン判定値が設定されていません。[キー:{KEY_EXCEL_LINE_KEY_VALUE_PAIR}]");
+ return false;
+ }
+ LoggerUxer.Info($"[ライン判定値:{lineJudgeValue}]");
+
+ // ライン名→ID変換辞書
+ var convList = lineJudgeValue.Split('|').ToList();
+ Dictionary convDic = new Dictionary();
+ foreach (var str in convList)
+ {
+ var items = str.Split(',');
+ if (items.Length < 2) continue;
+ convDic.Add(items[0], items[1]);
+ }
+ if (convDic.Count == 0)
+ {
+ LoggerUxer.Error($"ラインID辞書が0件です。[キー:{KEY_EXCEL_LINE_KEY_VALUE_PAIR}]");
+ return false;
+ }
+
+ // ライン名(というか変換元文字列)のセル値取得
+ var lineValue = sheet.Cell(lineCell).GetFormattedString();
+
+ // 辞書変換
+ if (!convDic.ContainsKey(lineValue))
+ {
+ LoggerUxer.Error(
+ $"ラインID辞書に登録されていません。" +
+ $"[{KEY_EXCEL_LINE_KEY_VALUE_PAIR}:{lineJudgeValue}," +
+ $"{KEY_EXCEL_LINE_KEY_CELL}:{lineCell}," +
+ $"セル値:{lineValue}]");
+ return false;
+ }
+
+ // ラインID
+ var strLineId = convDic[lineValue];
+ if (!int.TryParse(strLineId, out var intValue))
+ {
+ LoggerUxer.Error(
+ $"ラインIDが数値ではありません。" +
+ $"[{KEY_EXCEL_LINE_KEY_VALUE_PAIR}:{lineJudgeValue}," +
+ $"{KEY_EXCEL_LINE_KEY_CELL}:{lineCell}," +
+ $"セル値:{lineValue}," +
+ $"ラインID値:{strLineId}");
+ return false;
+ }
+ lineId = intValue;
+ return true;
+ }
+ LoggerUxer.Info($"セルからのラインID取得なし。[キー:{KEY_EXCEL_LINE_KEY_CELL}]");
+ return true;
+ }
+
+ // 開始行取得
+ private static bool TryGetStartRow(
+ IXLWorksheet sheet,
+ Dictionary iniDic,
+ out int startRow)
+ {
+ const string KEY_EXCEL_DATA_START_ROW_JUDGE_COL = "ExcelDataStartRowJudgeCol";
+ const string KEY_EXCEL_DATA_START_ROW_JUDGE_VALUES = "ExcelDataStartRowJudgeValues";
+
+ startRow = -1;
+
+ // データ開始行判定値
+ List dataStartRowJudgeValues = new List();
+
+ var str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_START_ROW_JUDGE_COL, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルにデータ開始行判定列が設定されていません。[キー:{KEY_EXCEL_DATA_START_ROW_JUDGE_COL}]");
+ return false;
+ }
+ if (!XlUxer.TryConvertColLetterToNumber(str, out var dataStartRowJudgeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのデータ開始行判定列が不正です。[キー:{KEY_EXCEL_DATA_START_ROW_JUDGE_COL},値:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[データ開始行判定列:{str}(番号:{dataStartRowJudgeCol})]");
+
+ // データ開始行判定値
+ str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_START_ROW_JUDGE_VALUES, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"設定ファイルにデータ開始行判定値が設定されていません。[キー:{KEY_EXCEL_DATA_START_ROW_JUDGE_VALUES}]");
+ return false;
+ }
+ dataStartRowJudgeValues = str.Split(',').ToList();
+ LoggerUxer.Info($"[データ開始行判定値:{string.Join(",", dataStartRowJudgeValues.ToArray())}]");
+
+ // 1000行まで走査
+ for (var row = 1; row <= 1000; row++)
+ {
+ // データ開始行判定
+ var dataStartRowJudgeCell = sheet.Cell(row, dataStartRowJudgeCol).GetFormattedString().Trim();
+ if (!string.IsNullOrEmpty(dataStartRowJudgeCell) &&
+ dataStartRowJudgeValues.Contains(dataStartRowJudgeCell))
+ {
+ // データ開始行
+ var dataStartRow = row + 1;
+
+ // 👇多分不要なので削除
+ //if (string.IsNullOrEmpty(sheet.Cell(dataStartRow, dataStartRowJudgeCol).GetFormattedString().Trim()))
+ //{
+ // dataStartRow++;
+ //}
+
+ startRow = dataStartRow;
+ LoggerUxer.Info($"[データ開始行:{startRow}]");
+ break;
+ }
+ }
+ return !(startRow == -1);
+ }
+
+ ///
+ /// Excelシートよりデータ取得
+ ///
+ /// シート
+ /// ライン情報
+ /// 日付辞書
+ /// 開始日
+ /// INI辞書
+ /// [参照]WE生産計画詳細リスト
+ /// [参照]タクト管理リスト
+ /// 成否
+ private static bool GetData(
+ IXLWorksheet sheet,
+ ExcelLineDto lineInfo,
+ DateTime now,
+ Dictionary dateDic,
+ DateTime fromDate,
+ Dictionary iniDic,
+ List weOrderList)
+ {
+ const string KEY_EXCEL_DATA_END_JUDGE_COL = "ExcelDataEndJudgeCol";
+ const string KEY_EXCEL_DATA_END_JUDGE_VALUE = "ExcelDataEndJudgeValue";
+ const string KEY_EXCEL_HIDDEN_ROW_HANDLING = "ExcelHiddenRowHandling";
+ const string KEY_EXCEL_AF_WE_COL = "ExcelAfWeCol";
+
+ const string HIDDEN_ROW_HANDLING_SKIP = "skip";
+ const string HIDDEN_ROW_HANDLING_INCLUDE = "include";
+ const string HIDDEN_ROW_HANDLING_WARN = "warn";
+
+ // データ終了判定列
+ var str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_END_JUDGE_COL, string.Empty);
+ //if (int.TryParse(str, out var excelDataEndJudgeCol) == false || excelDataEndJudgeCol < 1)
+ if (!XlUxer.TryConvertColLetterToNumber(str, out var excelDataEndJudgeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのExcelデータ終了判定列が未設定または不正な値です。[{KEY_EXCEL_DATA_END_JUDGE_COL}:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[データ終了判定列:{str}(番号:{excelDataEndJudgeCol})]");
+
+ // データ終了判定値
+ var excelDataEndJudgeValue = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_END_JUDGE_VALUE, string.Empty);
+
+ // 非表示行の扱い(未指定時はwarn)
+ var hiddenRowHandlinng = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_HIDDEN_ROW_HANDLING, HIDDEN_ROW_HANDLING_WARN);
+ LoggerUxer.Info($"[非表示行の扱い({KEY_EXCEL_HIDDEN_ROW_HANDLING})={hiddenRowHandlinng}]");
+
+ // MC生産負荷行番号の取得
+ if (!GetMcSeisanFukaRow(sheet, iniDic, out var mcSeisanFukaRow))
+ {
+ return false;
+ }
+ if (mcSeisanFukaRow >= 1)
+ {
+ LoggerUxer.Info($"[MC生産負荷行番号:{mcSeisanFukaRow}]");
+ }
+
+ // AF/WE列
+ str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_AF_WE_COL, string.Empty);
+ if (str == string.Empty)
+ {
+ LoggerUxer.Error($"設定ファイルにAF/WE列が登録されていません。[キー:{KEY_EXCEL_AF_WE_COL}]");
+ return false;
+ }
+ if (!XlUxer.TryConvertColLetterToNumber(str, out var excelAfWeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのAF/WE列の設定値が不正です。[{KEY_EXCEL_AF_WE_COL}:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[AF/WE列:{str}(番号:{excelAfWeCol})]");
+
+ // データ開始行から繰り返す
+ for (int row = lineInfo.DataStartRow; ; row++)
+ {
+ // データ行終了値が見つからない
+ if (row > 1000)
+ {
+ LoggerUxer.Error($"データ終了判定値が見つかりません。[{KEY_EXCEL_DATA_END_JUDGE_COL}:{excelDataEndJudgeCol},{KEY_EXCEL_DATA_END_JUDGE_VALUE}:{excelDataEndJudgeValue}]");
+ return false;
+ }
+
+ // データ行終了判定
+ var judgeValue = sheet.Cell(row, excelDataEndJudgeCol).GetFormattedString();
+ if (StringUxer.WildcardMatch(
+ judgeValue,
+ excelDataEndJudgeValue))
+ {
+ LoggerUxer.Info($"[データ行終了判定値検出行:{row},判定値:{judgeValue}]");
+ break;
+ }
+
+ if (sheet.Row(row).IsHidden)
+ {
+ // 非表示行の時
+ switch(hiddenRowHandlinng.ToLower())
+ {
+ case HIDDEN_ROW_HANDLING_SKIP:
+ // スキップ
+ continue;
+ case HIDDEN_ROW_HANDLING_INCLUDE:
+ // 対象
+ break;
+ case HIDDEN_ROW_HANDLING_WARN:
+ // 警告(ログ+スキップ)
+ LoggerUxer.Warn($"非表示行をスキップします。[行番号:{row}]");
+ continue;
+ default:
+ // 無効値
+ LoggerUxer.Error($"設定ファイルの非表示行の扱いに無効な値が設計されています。[キー:{KEY_EXCEL_HIDDEN_ROW_HANDLING},値:{hiddenRowHandlinng}]");
+ return false;
+ }
+ }
+
+ //// 機種コード(基本部番)が空の行は飛ばす(GCellは結合セルも加味している)
+ //if (string.IsNullOrEmpty(XlUxer.GCell(sheet, row, lineInfo.LineCol).GetFormattedString())) continue;
+ // AF/WE判定列が空の行は飛ばす
+ if (string.IsNullOrEmpty(XlUxer.GCell(sheet, row, excelAfWeCol).GetFormattedString())) continue;
+
+ // WE生産計画詳細データ取得
+ if (!GetWeOrderFromSheet(sheet, iniDic, lineInfo, now, row, dateDic, fromDate, excelAfWeCol, mcSeisanFukaRow, weOrderList))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static bool GetDataEazy(
+ IXLWorksheet sheet,
+ DateTime now,
+ Dictionary dateDic,
+ DateTime fromDate,
+ Dictionary iniDic,
+ List cdList,
+ ExcelSettingsDto excelSettings,
+ List outList)
+ {
+ const string KEY_EXCEL_DATA_END_JUDGE_COL = "ExcelDataEndJudgeCol";
+ const string KEY_EXCEL_DATA_END_JUDGE_VALUE = "ExcelDataEndJudgeValue";
+ const string KEY_EXCEL_HIDDEN_ROW_HANDLING = "ExcelHiddenRowHandling";
+ const string KEY_EXCEL_AF_WE_COL = "ExcelAfWeCol";
+ const string KEY_EXCEL_ROW_KIND_COL = "ExcelRowKindCol";
+ const string KEY_EXCEL_ROW_KIND_TARGETS = "ExcelRowKindTargets";
+
+ const string HIDDEN_ROW_HANDLING_SKIP = "skip";
+ const string HIDDEN_ROW_HANDLING_INCLUDE = "include";
+ const string HIDDEN_ROW_HANDLING_WARN = "warn";
+
+ // データ終了判定列
+ var str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_END_JUDGE_COL, string.Empty);
+ if (!XlUxer.TryConvertColLetterToNumber(str, out var excelDataEndJudgeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのExcelデータ終了判定列が未設定または不正な値です。[{KEY_EXCEL_DATA_END_JUDGE_COL}:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[データ終了判定列:{str}(番号:{excelDataEndJudgeCol})]");
+
+ // データ終了判定値
+ var excelDataEndJudgeValue = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_DATA_END_JUDGE_VALUE, string.Empty);
+ var dataEndRetryCount = 0;
+ if (excelDataEndJudgeValue.IndexOf(",") >= 0)
+ {
+ // カンマあり
+ var items = excelDataEndJudgeValue.Split(',');
+ if (items.Length == 2)
+ {
+ if (int.TryParse(items[1], out var intValue))
+ {
+ dataEndRetryCount = intValue;
+ excelDataEndJudgeValue = items[0];
+ }
+ }
+ }
+
+ // 非表示行の扱い(未指定時はwarn)
+ var hiddenRowHandlinng = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_HIDDEN_ROW_HANDLING, HIDDEN_ROW_HANDLING_WARN);
+ LoggerUxer.Info($"[非表示行の扱い({KEY_EXCEL_HIDDEN_ROW_HANDLING})={hiddenRowHandlinng}]");
+
+ // AF/WE列
+ str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_AF_WE_COL, string.Empty);
+ var strK = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_ROW_KIND_COL, string.Empty);
+ if (string.IsNullOrEmpty(str) && string.IsNullOrEmpty(strK))
+ {
+ LoggerUxer.Error($"設定ファイルにAF/WE列または行種類列が登録されていません。[キー:{KEY_EXCEL_AF_WE_COL},{KEY_EXCEL_ROW_KIND_COL}]");
+ return false;
+ }
+ var excelAfWeCol = 0;
+ if (!string.IsNullOrEmpty(str) && !XlUxer.TryConvertColLetterToNumber(str, out excelAfWeCol))
+ {
+ LoggerUxer.Error($"設定ファイルのAF/WE列の設定値が不正です。[{KEY_EXCEL_AF_WE_COL}:{str}]");
+ return false;
+ }
+ var excelRowKindColNoList = new List();
+ if (!string.IsNullOrEmpty(strK))
+ {
+ var colNos = strK.Split('+');
+ foreach (var colNo in colNos)
+ {
+ var intVal = -1;
+ if (!string.IsNullOrEmpty(colNo) && !XlUxer.TryConvertColLetterToNumber(colNo, out intVal))
+ {
+ LoggerUxer.Error($"設定ファイルの行種類列の設定値が不正です。[{KEY_EXCEL_ROW_KIND_COL}:{strK}]");
+ return false;
+ }
+ if (intVal != -1) excelRowKindColNoList.Add(intVal);
+ }
+ }
+ List rowKindTargetsList = null;
+ if (excelRowKindColNoList.Count > 0)
+ {
+ var strRowKinds = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_ROW_KIND_TARGETS, string.Empty);
+ if (string.IsNullOrEmpty(strRowKinds))
+ {
+ LoggerUxer.Error($"設定ファイルに行種類列の対象値が登録されていません。[キー:{KEY_EXCEL_ROW_KIND_TARGETS}]");
+ return false;
+ }
+ rowKindTargetsList = strRowKinds.Split(',').ToList();
+ }
+ if (excelAfWeCol == 0)
+ {
+ LoggerUxer.Info($"[AF/WE列:なし]");
+ }
+ else
+ {
+ LoggerUxer.Info($"[AF/WE列:{str}(番号:{excelAfWeCol})]");
+ }
+ if (excelRowKindColNoList.Count == 0)
+ {
+ LoggerUxer.Info($"[行種類列:なし]");
+ }
+ else
+ {
+ LoggerUxer.Info($"[行種類列:{strK}(番号:{string.Join(",", excelRowKindColNoList)})]");
+ }
+
+ if (!TryGetStartRow(sheet, iniDic, out var startRow))
+ {
+ LoggerUxer.Error($"開始行の取得に失敗しました。");
+ return false;
+ }
+
+ // データ開始行から繰り返す
+ var endJudgeCnt = 0;
+ for (int row = startRow; ; row++)
+ {
+ // データ行終了値が見つからない
+ if (row > 3000)
+ {
+ LoggerUxer.Error($"データ終了判定値が見つかりません。[{KEY_EXCEL_DATA_END_JUDGE_COL}:{excelDataEndJudgeCol},{KEY_EXCEL_DATA_END_JUDGE_VALUE}:{excelDataEndJudgeValue}]");
+ return false;
+ }
+
+ // データ行終了判定
+ var judgeValue = XlUxer.GCell(sheet, row, excelDataEndJudgeCol).GetFormattedString().Trim();
+
+ //if (string.IsNullOrEmpty(judgeValue))
+ // LoggerUxer.Info("ここよ💖");
+ if (row == 402)
+ LoggerUxer.Info("ここよ💖");
+
+ if (StringUxer.WildcardMatch(
+ judgeValue,
+ excelDataEndJudgeValue))
+ {
+ if (dataEndRetryCount > 0)
+ {
+ endJudgeCnt++;
+
+ if (endJudgeCnt > dataEndRetryCount)
+ {
+ // おわり
+ LoggerUxer.Info($"[データ行終了判定値検出行:{row},判定値:{judgeValue},連続回数:{endJudgeCnt}]");
+ break;
+ }
+ LoggerUxer.Info($"[データ行終了判定値検出行:{row},判定値:{judgeValue},連続回数:{endJudgeCnt}]");
+ continue;
+ }
+ LoggerUxer.Info($"[データ行終了判定値検出行:{row},判定値:{judgeValue}]");
+ break;
+ }
+ else
+ {
+ endJudgeCnt = 0;
+ }
+
+ if (sheet.Row(row).IsHidden)
+ {
+ // 非表示行の時
+ switch (hiddenRowHandlinng.ToLower())
+ {
+ case HIDDEN_ROW_HANDLING_SKIP:
+ // スキップ
+ continue;
+ case HIDDEN_ROW_HANDLING_INCLUDE:
+ // 対象
+ break;
+ case HIDDEN_ROW_HANDLING_WARN:
+ // 警告(ログ+スキップ)
+ LoggerUxer.Warn($"非表示行をスキップします。[行番号:{row}]");
+ continue;
+ default:
+ // 無効値
+ LoggerUxer.Error($"設定ファイルの非表示行の扱いに無効な値が設計されています。[キー:{KEY_EXCEL_HIDDEN_ROW_HANDLING},値:{hiddenRowHandlinng}]");
+ return false;
+ }
+ }
+
+ // AF/WE判定列が空の行は飛ばす
+ if (excelAfWeCol > 0 &&
+ string.IsNullOrEmpty(XlUxer.GCell(sheet, row, excelAfWeCol).GetFormattedString()))
+ continue;
+
+ // 行種類が対象に含まれない行は飛ばす
+ var rowKind = string.Empty;
+ //var isRowKindFirst = false;
+ //var isRowKindLast = false;
+ if (excelRowKindColNoList.Count > 0)
+ {
+ // 複数列指定対応
+ foreach (var col in excelRowKindColNoList)
+ {
+ rowKind += XlUxer.GCell(sheet, row, col).GetFormattedString().Trim();
+ }
+
+ // 改行除去
+ rowKind = StringUxer.CutKaigyo(rowKind);
+
+ if (string.IsNullOrEmpty(rowKind)) continue;
+ if (!rowKindTargetsList.Contains(rowKind)) continue;
+
+ // 👇未使用のため削除
+ //isRowKindFirst = rowKindTargetsList.IndexOf(rowKind) == 0;
+ //isRowKindLast = rowKindTargetsList.IndexOf(rowKind) == (rowKindTargetsList.Count - 1);
+ }
+
+ // 日毎値
+ var targetDateList = dateDic
+ .Where(m => m.Value >= fromDate)
+ .OrderBy(m => m.Key)
+ .ToList();
+ foreach (var kvp in targetDateList)
+ {
+ if (sheet.Cell(row, kvp.Key).TryGetValue(out var intValue) &&
+ intValue != 0)
+ {
+ // 数値の値があるとき(あっても0以外)のみデータ作成
+
+ // 項目データ取得
+ if (!TryGetEasyItems(sheet, row, cdList, kvp.Value, intValue, excelSettings, out var items, out var messageForMe))
+ {
+ LoggerUxer.Error($"Eazy項目値取得に失敗しました。[エラー詳細:{messageForMe}]");
+ return false;
+ }
+
+ // リストに追加
+ outList.Add(items);
+ }
+ }
+ }
+ return true;
+ }
+
+ private static bool TryGetEasyItems(
+ IXLWorksheet sheet,
+ int row,
+ List cdList,
+ DateTime date,
+ int su,
+ ExcelSettingsDto excelSettings,
+ out string[] items,
+ out string messageForMe)
+ {
+ items = new string[cdList.Count];
+ messageForMe = string.Empty;
+
+ for (int cnt = 0; cnt < cdList.Count; cnt++)
+ {
+ //if (cnt == 5)
+ // LoggerUxer.Info("きたよ💖");
+
+ var item = string.Empty;
+
+ switch(cdList[cnt].Type)
+ {
+ case ColumnType.Fixed:
+ item = cdList[cnt].FixedValue;
+ break;
+ case ColumnType.Mapping:
+ if (!ExcelCellValidatorUxer.IsValidA1Format(cdList[cnt].TargetCol + "1"))
+ {
+ messageForMe = $"列レターが不正です。[項目名:{cdList[cnt].LogicalName},列レター値:{cdList[cnt].TargetCol}]";
+ return false;
+ }
+ var col = ExcelCellValidatorUxer.ColumnNameToNumber(cdList[cnt].TargetCol);
+ item = XlUxer.GCell(sheet, row, col).GetFormattedString().Trim();
+ break;
+ case ColumnType.Conversion:
+ case ColumnType.FileConversion:
+ if (!ExcelCellValidatorUxer.IsValidA1Format(cdList[cnt].TargetCol + "1"))
+ {
+ messageForMe = $"列レターが不正です。[項目名:{cdList[cnt].LogicalName},列レター値:{cdList[cnt].TargetCol}]";
+ return false;
+ }
+ col = ExcelCellValidatorUxer.ColumnNameToNumber(cdList[cnt].TargetCol);
+ var key = XlUxer.GCell(sheet, row, col).GetFormattedString().Trim(); // スペース値のみのとき空文字とする
+ key = key.Replace("\r", "").Replace("\n", "");
+
+ // まずは標準辞書から
+ item = DictionaryUxer.GetValueOrDefault(
+ cdList[cnt].ConvertMap, key, string.Empty);
+
+ if (string.IsNullOrEmpty(item))
+ {
+ // ないとき、Excel辞書から
+ if (excelSettings.KVPDic.ContainsKey(cdList[cnt].LogicalName))
+ {
+ var dic = excelSettings.KVPDic[cdList[cnt].LogicalName];
+ item = DictionaryUxer.GetValueOrDefault(
+ dic, key, string.Empty);
+ }
+ }
+
+ if (string.IsNullOrEmpty(item))
+ {
+ messageForMe = $"変換値が取得できませんでした。[項目名:{cdList[cnt].LogicalName},セル値:{key}]";
+ return false;
+ }
+ break;
+ case ColumnType.FuncReplace:
+ var str = cdList[cnt].FixedValue.Trim().Trim('(').Trim(')').Trim();
+ string[] delimita = new string[] { "→"};
+ var part = str.Split(delimita, StringSplitOptions.None);
+ if (part.Length != 2)
+ {
+ messageForMe = $"関数指定内容が不正です。[項目名:{cdList[cnt].LogicalName},関数指定内容:{cdList[cnt].FixedValue}]";
+ return false;
+ }
+ var letter = cdList[cnt].TargetCol.Trim();
+ if (!ExcelCellValidatorUxer.IsValidA1Format(letter + "1"))
+ {
+ messageForMe = $"関数指定値の列が不正です。[項目名:{cdList[cnt].LogicalName},列レター値:{cdList[cnt].TargetCol}]";
+ return false;
+ }
+ col = ExcelCellValidatorUxer.ColumnNameToNumber(letter);
+ var text = XlUxer.GCell(sheet, row, col).GetFormattedString().Trim();
+ item = text.Replace(part[0].Trim('\"'), part[1].Trim('\"'));
+ break;
+
+ case ColumnType.FuncSubstring:
+ str = cdList[cnt].FixedValue.Trim().Trim('(').Trim(')').Trim();
+ part = str.Split(',');
+ if (part.Length != 2)
+ {
+ messageForMe = $"関数指定内容が不正です。[項目名:{cdList[cnt].LogicalName},関数指定内容:{cdList[cnt].FixedValue}]";
+ return false;
+ }
+ letter = cdList[cnt].TargetCol.Trim();
+ if (!ExcelCellValidatorUxer.IsValidA1Format(letter + "1"))
+ {
+ messageForMe = $"関数指定値の列が不正です。[項目名:{cdList[cnt].LogicalName},列レター値:{cdList[cnt].TargetCol}]";
+ return false;
+ }
+ col = ExcelCellValidatorUxer.ColumnNameToNumber(letter);
+ text = XlUxer.GCell(sheet, row, col).GetFormattedString().Trim();
+
+ if (!int.TryParse(part[0].Trim(), out var intStartKeta))
+ {
+ messageForMe = $"関数指定値の開始桁が不正です。[項目名:{cdList[cnt].LogicalName},開始位置:{part[0].Trim()}]";
+ return false;
+ }
+
+ if (!int.TryParse(part[1].Trim(), out var intKetasu))
+ {
+ messageForMe = $"関数指定値の桁数が不正です。[項目名:{cdList[cnt].LogicalName},開始位置:{part[1].Trim()}]";
+ return false;
+ }
+
+ item = text.Substring(intStartKeta - 1, intKetasu);
+ break;
+
+ case ColumnType.HorizontalDate:
+ item = date.ToString("yyyy/MM/dd");
+ break;
+ case ColumnType.ValueAmount:
+ if (!string.IsNullOrEmpty(cdList[cnt].FixedValue) &&
+ !string.IsNullOrEmpty(cdList[cnt].TargetCol))
+ {
+ var valueList = cdList[cnt].FixedValue.Split('|').ToList();
+ var colList = cdList[cnt].TargetCol.Split('+').ToList();
+ var text2 = string.Empty;
+ foreach(var col2 in colList)
+ {
+ if (!XlUxer.TryConvertColLetterToNumber(col2, out var _))
+ {
+ messageForMe = $"列レターが不正です。[項目名:{cdList[cnt].LogicalName},列レター:{cdList[cnt].TargetCol}]";
+ return false;
+ }
+ text2 += XlUxer.GCell(sheet, col2 + row).GetFormattedString().Trim();
+ }
+ text2 = StringUxer.CutKaigyo(text2);
+
+ if (valueList.Contains(text2))
+ {
+ item = su.ToString();
+ }
+ else
+ {
+ item = string.Empty;
+ }
+ }
+ else
+ {
+ item = su.ToString();
+ }
+ break;
+ case ColumnType.LineId:
+ if (string.IsNullOrEmpty(cdList[cnt].FixedValue))
+ {
+ messageForMe = $"ラインIDが取得されていません。[項目名:{cdList[cnt].LogicalName}]";
+ return false;
+ }
+ item = cdList[cnt].FixedValue;
+ break;
+ case ColumnType.ModuleId:
+ if (string.IsNullOrEmpty(cdList[cnt].FixedValue))
+ {
+ messageForMe = $"モジュールIDが取得されていません。[項目名:{cdList[cnt].LogicalName}]";
+ return false;
+ }
+ item = cdList[cnt].FixedValue;
+ break;
+ }
+ items[cnt] = item;
+ }
+ return true;
+ }
+
+ /////
+ ///// タクト管理データ取得
+ /////
+ ///// シート
+ ///// ライン情報
+ ///// 行
+ ///// INI辞書
+ ///// リスト
+ ///// [出力]タクトインデックス
+ ///// 成否
+ //private static bool GetTactManagementFromRow(IXLWorksheet sheet, ExcelLineDto lineInfo, int row, ref List list, out int tactIndex)
+ //{
+
+ // // 基本部番
+ // var kihonBuban = CreateBuban(CutKaigyo(XlUxer.GCell(sheet, row, COL_BUBAN).GetFormattedString()));
+
+ // // 機種コード
+ // var modelCd = XlUxer.GCell(sheet, row, COL_MODEL_CD).GetFormattedString();
+ // if (string.IsNullOrEmpty(modelCd))
+ // {
+ // // 空のとき、既存リスト内の同一部番があればそこから取得
+ // var dto = list
+ // .FirstOrDefault(m => m.BasicPartsNo == kihonBuban);
+ // if (dto != null)
+ // {
+ // modelCd = dto.ModelCd;
+ // }
+ // else
+ // {
+ // // ないとき、上の行を探る!
+ // for (var rowTmp = row - 1; rowTmp >= 1; rowTmp--)
+ // {
+ // var str = XlUxer.GCell(sheet, rowTmp, COL_MODEL_CD).GetFormattedString();
+ // if (!string.IsNullOrEmpty(str))
+ // {
+ // modelCd = str;
+ // break;
+ // }
+ // }
+ // if (string.IsNullOrEmpty(modelCd)) modelCd = "(No Model code!)";
+ // }
+ // }
+
+ // // 派生
+ // var delivation = XlUxer.GCell(sheet, row, COL_DERIVATION).GetFormattedString();
+
+ // // タクト
+ // var tact = 0;
+ // if(XlUxer.GCell(sheet, row, COL_TACT).TryGetValue(out var t))
+ // {
+ // tact = t;
+ // }
+
+ // // リストに追加しタクトインデックス取得
+ // tactIndex = TactManagementDto.AddToList(list, new TactManagementDto()
+ // {
+ // LineId = lineInfo.LineId,
+ // ModelCd = modelCd,
+ // BasicPartsNo = kihonBuban,
+ // Derivation = delivation,
+ // Tact = tact,
+ // });
+ // return true;
+ //}
+
+ ///
+ /// 改行コードカット
+ ///
+ /// 文字列
+ /// カット後文字列
+ private static string CutKaigyo(string str)
+ {
+ return str
+ .Replace("\r\n", "")
+ .Replace("\r", "")
+ .Replace("\n", "");
+ }
+
+ ///
+ /// 部番作成
+ ///
+ ///
+ ///
+ private static string CreateBuban(string str)
+ {
+ // 謎の全角ハイフン
+ str = str.Replace("‐", "-");
+
+ // スペースも稀にあり!
+ str = str.Replace(" ", "");
+
+ // 中のスペースは残し、両端のスペースをカット
+ //str = str.Replace(" ", "");
+ str = str.Trim();
+
+ // 後ろのスペースは不要!
+ //return (str.Replace("-", " ") + " ").Substring(0, 15);
+ return str.Replace("-", " ").Trim();
+ }
+
+ ///
+ /// アイテムと列レターのマッピング辞書
+ ///
+ private static Dictionary ItemColumnMappingDic = null;
+
+ private const string INI_KEY_EXCEL_KIHON_BUBAN_GYOSU = "ExcelKihonBubanGyosu";
+ private const string INI_KEY_EXCEL_SHIMUKE_TACT_ROW_ZURE = "ExcelShimukeTactRowZure";
+
+ // WE生産計画詳細データ取得
+ private static bool GetWeOrderFromSheet(
+ IXLWorksheet sheet,
+ Dictionary iniDic,
+ ExcelLineDto lineInfo,
+ DateTime now,
+ int row,
+ Dictionary dateDic,
+ DateTime fromDate,
+ int afWeCol,
+ int mcSeisanFukaRow,
+ List list)
+ {
+ //if (int.TryParse(strAfWeCol, out var afWeCol) == false || afWeCol < 1)
+ //{
+ // LoggerUxer.Error($"設定ファイルのAE/WE列番号の設定値が不正です。[キー:{KEY_EXCEL_AF_WE_COL},値:{strAfWeCol}]");
+ // return false;
+ //}
+
+ //if (int.TryParse(strAfWeCol, out var afWeCol) == false || afWeCol < 1)
+ //{
+ // LoggerUxer.Error($"設定ファイルのAE/WE列番号の設定値が不正です。[キー:{KEY_EXCEL_AF_WE_COL},値:{strAfWeCol}]");
+ // return false;
+ //}
+
+ //int COL_BUBAN = lineInfo.LineCol;
+ //int COL_MODEL_CD = COL_BUBAN - 1;
+ //int COL_DERIVATION = COL_BUBAN + 1;
+ //int COL_TACT = COL_DERIVATION + 1;
+
+ // メンバ名前取得用
+ var _dto_ = new WeOrderDto();
+
+ // プロパティのExcelレター登録有無チェック
+ if (string.IsNullOrEmpty(DictionaryUxer.GetValueOrDefault(ItemColumnMappingDic, nameof(_dto_.BasicPartsNo), string.Empty)))
+ {
+ LoggerUxer.Error($"プロパティに対してExcel列レターが登録されていません。[プロパティ:{nameof(_dto_.BasicPartsNo)},登録済みのプロパティ:{string.Join(",", ItemColumnMappingDic.Keys)}]");
+ return false;
+ }
+ if (string.IsNullOrEmpty(DictionaryUxer.GetValueOrDefault(ItemColumnMappingDic, nameof(_dto_.ModelCd), string.Empty)))
+ {
+ LoggerUxer.Error($"プロパティに対してExcel列レターが登録されていません。[プロパティ:{nameof(_dto_.ModelCd)},登録済みのプロパティ:{string.Join(",", ItemColumnMappingDic.Keys)}]");
+ return false;
+ }
+ if (string.IsNullOrEmpty(DictionaryUxer.GetValueOrDefault(ItemColumnMappingDic, nameof(_dto_.Derivation), string.Empty)))
+ {
+ LoggerUxer.Error($"プロパティに対してExcel列レターが登録されていません。[プロパティ:{nameof(_dto_.Derivation)},登録済みのプロパティ:{string.Join(",", ItemColumnMappingDic.Keys)}]");
+ return false;
+ }
+ if (string.IsNullOrEmpty(DictionaryUxer.GetValueOrDefault(ItemColumnMappingDic, nameof(_dto_.TactTime), string.Empty)))
+ {
+ LoggerUxer.Error($"プロパティに対してExcel列レターが登録されていません。[プロパティ:{nameof(_dto_.TactTime)},登録済みのプロパティ:{string.Join(",", ItemColumnMappingDic.Keys)}]");
+ return false;
+ }
+ // 派生(区分)とタクトの行ずれ数
+ var haseiTactZure = int.TryParse(
+ DictionaryUxer.GetValueOrDefault(
+ iniDic, INI_KEY_EXCEL_SHIMUKE_TACT_ROW_ZURE, "0"), out var intVal0)
+ ? intVal0 : 0;
+
+ // 基本部番行数
+ var kihonBubanGyosu =
+ int.TryParse(
+ DictionaryUxer.GetValueOrDefault(iniDic, INI_KEY_EXCEL_KIHON_BUBAN_GYOSU, "1"),
+ out var intVal) ? intVal : 1;
+
+ // 基本部番列番号
+ var colNo = XlUxer.GetColNo(ItemColumnMappingDic[nameof(_dto_.BasicPartsNo)]);
+ // 基本部番
+ var kihonBuban = string.Empty;
+ for (var cnt = 0; ; cnt++)
+ {
+ var rowTmp = row - cnt;
+ kihonBuban = XlUxer.GCell(sheet, rowTmp, colNo).GetFormattedString();
+ if (kihonBubanGyosu >= 2) kihonBuban += XlUxer.GCell(sheet, rowTmp + 1, colNo).GetFormattedString();
+ if (kihonBubanGyosu >= 3) kihonBuban += XlUxer.GCell(sheet, rowTmp + 2, colNo).GetFormattedString();
+ kihonBuban = CreateBuban(CutKaigyo(kihonBuban));
+ // とりあえず長さが10以上であれば連結成功とみなす!
+ if (kihonBuban.Trim().Length >= 10) break;
+ if (cnt >= 10)
+ {
+ LoggerUxer.Error($"基本部番の取得に失敗しました。[シート名:{sheet.Name},行:{row}]");
+ return false;
+ }
+ }
+
+ // 機種コード列(レター)
+ var letter = ItemColumnMappingDic[nameof(_dto_.ModelCd)];
+
+ // 機種コード
+ var modelCd = string.Empty;
+ if (letter.IndexOf(",") >= 0)
+ {
+ // 漁法モード
+ var strSplit = letter.Split(',');
+ var gyohoName = strSplit[0].Trim();
+ switch (gyohoName)
+ {
+ case "別シート":
+ // バリデ済みのためここではバリデしない
+ var sheetName = strSplit[1].Trim();
+ var bubanColLetter = strSplit[2].Trim();
+ var kishuColLetter = strSplit[3].Trim();
+ var startRow = int.Parse(strSplit[4].Trim());
+ var book = sheet.Workbook;
+ if (!book.Worksheets.Contains(sheetName))
+ {
+ // シート名なし
+ LoggerUxer.Error($"機種コードの漁法でシート名が存在しません。[シート名:{sheetName},キー名:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING}]");
+ return false;
+ }
+ var sheetTmp = book.Worksheet(sheetName);
+ const int KARA_GYO_MAX = 30;
+ var karaGyoCnt = 0;
+ for (var rowTmp = startRow; rowTmp < 10000; rowTmp++)
+ {
+ var buban = sheetTmp.Cell(bubanColLetter + rowTmp).GetFormattedString().Trim();
+
+ // 救済システム:1個左の列も探してみたりする…
+ var colNoQsai = XlUxer.GetColNo(bubanColLetter);
+ // 1列目だったら諦めましょう…
+ if (colNoQsai != 1) colNoQsai--;
+ var bubanQsai = sheetTmp.Cell(ExcelColumnHelperUxer.GetExcelColumnLetter(colNoQsai) + rowTmp).GetFormattedString().Trim();
+ // そしてそれは、ハイフン付きのままだったりする…
+ bubanQsai = bubanQsai.Replace("-", " ");
+
+ var kishu = sheetTmp.Cell(kishuColLetter + rowTmp).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(buban) && string.IsNullOrEmpty(kishu))
+ {
+ // 空行
+ karaGyoCnt++;
+ if (karaGyoCnt >= KARA_GYO_MAX)
+ {
+ // 空行最大を超過👉別シートに登録なし
+ LoggerUxer.Error($"機種コードの漁法で基本部番がシートに登録されていません。[シート名:{sheetName},基本部番:{kihonBuban},キー名:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING}]");
+ return false;
+ }
+ }
+
+ if (buban.Length < 10) continue;
+
+ //LoggerUxer.Info($"[基本部番:{kihonBuban.Trim()},シート部番:{buban}]");
+ var kihonBuban_mae = kihonBuban.Trim().Substring(0, 8);
+ var kihonBuban_ato = kihonBuban.Trim().Substring(9);
+ //if (buban.IndexOf(kihonBuban.Trim()) >= 0 && !string.IsNullOrEmpty(kishu))
+ if (buban.Substring(0, 8) == kihonBuban_mae &&
+ buban.Substring(9).IndexOf(kihonBuban_ato) == 0 &&
+ !string.IsNullOrEmpty(kishu))
+ {
+ // 発見!(表では部番末尾にあと2桁ついていたりするので、部分一致で検索してます)
+ modelCd = kishu;
+ break;
+ }
+
+ if (bubanQsai.Length < 10) continue;
+
+ // 救済システム!左の列にあったりして…
+ //if (bubanQsai.IndexOf(kihonBuban.Trim()) >= 0 && !string.IsNullOrEmpty(kishu))
+ if (bubanQsai.Substring(0, 8) == kihonBuban_mae &&
+ bubanQsai.Substring(9).IndexOf(kihonBuban_ato) == 0 &&
+ !string.IsNullOrEmpty(kishu))
+ {
+ // 発見!
+ modelCd = kishu;
+ break;
+ }
+ }
+ if (string.IsNullOrEmpty(modelCd))
+ {
+ // 別シートに登録なし
+ LoggerUxer.Error($"機種コードの漁法で基本部番がシートに登録されていません。[シート名:{sheetName},基本部番:{kihonBuban},キー名:{KEY_EXCEL_ITEM_NAME_AND_COLUMN_LETTER_MAPPING}]");
+ return false;
+ }
+ break;
+ }
+ }
+ else
+ {
+ // 列指定モード
+ modelCd = XlUxer.GCell(sheet, row, XlUxer.GetColNo(letter)).GetFormattedString();
+ }
+
+ if (string.IsNullOrEmpty(modelCd))
+ {
+ // 空のとき、既存リスト内の同一部番があればそこから取得
+ var dto = list
+ .FirstOrDefault(m => m.BasicPartsNo == kihonBuban);
+ if (dto != null)
+ {
+ modelCd = dto.ModelCd;
+ }
+ else
+ {
+ // ないとき、上の行を探る!
+ if (ItemColumnMappingDic[nameof(_dto_.ModelCd)].IndexOf(",")>=0)
+ {
+ for (var rowTmp = row - 1; rowTmp >= 1; rowTmp--)
+ {
+ var str = XlUxer.GCell(sheet, rowTmp,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.ModelCd)])
+ ).GetFormattedString();
+ if (!string.IsNullOrEmpty(str))
+ {
+ modelCd = str;
+ break;
+ }
+ }
+ }
+ if (string.IsNullOrEmpty(modelCd)) modelCd = "(No Model code!)";
+ }
+ }
+
+ // 派生
+ var derivation = XlUxer.GCell(sheet, row + haseiTactZure,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.Derivation)])
+ ).GetFormattedString();
+
+ // 救済システム:1個上と2個上
+ if (string.IsNullOrEmpty(derivation))
+ derivation = XlUxer.GCell(sheet, row + haseiTactZure - 1,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.Derivation)])
+ ).GetFormattedString();
+ if (string.IsNullOrEmpty(derivation))
+ derivation = XlUxer.GCell(sheet, row + haseiTactZure - 2,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.Derivation)])
+ ).GetFormattedString();
+
+ // タクト
+ var tact = 0;
+ //if (XlUxer.GCell(sheet, row + haseiTactZure,
+ // XlUxer.GetColNo(
+ // ItemColumnMappingDic[nameof(_dto_.TactTime)])
+ // ).TryGetValue(out var t))
+ //{
+ // tact = t;
+ //}
+
+ // 救済システム:1個上と2個上も見る
+ var strT = string.Empty;
+ if (string.IsNullOrEmpty(XlUxer.GCell(sheet, row + haseiTactZure,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.TactTime)])
+ ).GetFormattedString()))
+ if (string.IsNullOrEmpty(XlUxer.GCell(sheet, row + haseiTactZure - 1,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.TactTime)])
+ ).GetFormattedString()))
+ strT = XlUxer.GCell(sheet, row + haseiTactZure - 2,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.TactTime)])
+ ).GetFormattedString();
+ else
+ strT = XlUxer.GCell(sheet, row + haseiTactZure - 1,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.TactTime)])
+ ).GetFormattedString();
+ else
+ strT = XlUxer.GCell(sheet, row + haseiTactZure,
+ XlUxer.GetColNo(
+ ItemColumnMappingDic[nameof(_dto_.TactTime)])
+ ).GetFormattedString();
+ int.TryParse(strT, out tact);
+
+ // AF/WE値
+ var afWe = sheet.Cell(row, afWeCol).GetFormattedString().Trim();
+ var ueAfWe = sheet.Cell(row - 1, afWeCol).GetFormattedString().Trim();
+
+ var targetDateList = dateDic
+ .Where(m => m.Value >= fromDate)
+ .OrderBy(m => m.Key)
+ .ToList();
+ foreach (var date in targetDateList)
+ {
+ if (sheet.Cell(row, date.Key).TryGetValue(out var intValue) &&
+ intValue != 0)
+ {
+ // 数値の値があるとき(あっても0以外)のみデータ作成
+ var weProductDate = date.Value;
+ var weAmount = 0;
+ var kdWeAmount = 0;
+ var afAmount = 0;
+ var kpsKintai = lineInfo.ShiftName;
+
+ int? productionLur = null;
+
+ if (mcSeisanFukaRow >= 1)
+ {
+ var str = sheet.Cell(mcSeisanFukaRow, date.Key).GetFormattedString();
+ str = str.Replace("%", "").Trim();
+ if (int.TryParse(str, out var intProductionLur) == false)
+ {
+ LoggerUxer.Warn($"MC生産負荷の取得に失敗しました。[日付:{date.Value},セル値:{sheet.Cell(mcSeisanFukaRow, date.Key).GetFormattedString()}]");
+ productionLur = -1;
+ }
+ else
+ {
+ productionLur = intProductionLur;
+ }
+ }
+
+ // 既存有無チェック
+ var kizonDto = list
+ .FirstOrDefault(
+ m =>
+ m.LineName == lineInfo.LineName &&
+ m.BasicPartsNo == kihonBuban &&
+ m.Derivation == derivation &&
+ m.WorkDate == weProductDate);
+
+ if ((afWe == "WE" && (ueAfWe == "KD" || derivation == "KD")) ||
+ (afWe == "CKD")) // CKDは新書式にて登場!
+ {
+ // KDのWEは別計上
+ afWe = "KDWE";
+ }
+
+ switch (afWe)
+ {
+ case "AF":
+ case "FUN": // 新書式にて追加
+ case "SP": // 新書式にて追加
+ case "MULTI": // 新書式にて追加
+ //case "KDWE": // KDWEはAFとして登録
+ afAmount = intValue;
+
+ if (kizonDto != null)
+ {
+ // 既存あり→更新
+ if (kizonDto.AfAmount == 0)
+ {
+ // 既存がゼロだったら更新
+ kizonDto.AfAmount = afAmount;
+ //LoggerUxer.Info($"★★★AFゼロ更新");
+ }
+ else if (kizonDto.AfAmount != afAmount)
+ {
+ // 既存と値が異なる場合、既存優先(更新しない)
+ LoggerUxer.Warn($"同一日同一コードでAF値が異なります(未更新)。[ライン名:{lineInfo.LineName},機種コード:{kihonBuban},日付:{weProductDate:yyyy/MM/dd},AF値①:{kizonDto.AfAmount},AF値②{afAmount}] ①のまま。");
+ }
+ else
+ {
+ // 既存と値が同じ場合、何もしない
+ //LoggerUxer.Info($"★★★AF同値[{afAmount}]");
+ }
+ }
+ else
+ {
+ // 追加
+ list.Add(new WeOrderDto()
+ {
+ CreateRecordDate = now,
+ LineId = lineInfo.LineId,
+ LineName = lineInfo.LineName,
+ BasicPartsNo = kihonBuban,
+ WorkDate = weProductDate,
+ AfAmount = afAmount,
+ WeAmount = weAmount,
+ KdWeAmount = kdWeAmount,
+ ProductionLur = productionLur,
+ ModelCd = modelCd,
+ Derivation = derivation,
+ TactTime = tact,
+ });
+ }
+ break;
+
+ case "WE":
+ // WE
+ weAmount = intValue;
+ if (kizonDto != null)
+ {
+ // 既存あり→更新
+ if (kizonDto.WeAmount == 0)
+ {
+ // 既存がゼロだったら更新
+ kizonDto.WeAmount = weAmount;
+ //LoggerUxer.Info($"★★★WEゼロ更新");
+ }
+ else if (kizonDto.WeAmount != weAmount)
+ {
+ // 既存と値が異なる場合、既存優先(更新しない)
+ LoggerUxer.Warn($"同一日同一コードでWE値が異なります(未更新)。[ライン名:{lineInfo.LineName},機種コード:{kihonBuban},日付:{weProductDate:yyyy/MM/dd},WE値①:{kizonDto.WeAmount},WE値②{weAmount}] ①のまま。");
+ }
+ else
+ {
+ // 既存と値が同じ場合、何もしない
+ //LoggerUxer.Info($"★★★WE同値[{weAmount}]");
+ }
+ }
+ else
+ {
+ // 追加
+ list.Add(new WeOrderDto()
+ {
+ CreateRecordDate = now,
+ LineId = lineInfo.LineId,
+ LineName = lineInfo.LineName,
+ BasicPartsNo = kihonBuban,
+ WorkDate = weProductDate,
+ AfAmount = afAmount,
+ WeAmount = weAmount,
+ KdWeAmount = kdWeAmount,
+ ProductionLur = productionLur,
+ ModelCd = modelCd,
+ Derivation = derivation,
+ TactTime = tact,
+ });
+ }
+ break;
+
+ case "KDWE":
+ // KDWE
+ kdWeAmount = intValue;
+ // ※注意:最終的なテーブル項目へのマッピングはINSERT-SQLに委ねる。
+
+ if (kizonDto != null)
+ {
+ // 既存あり→更新
+ if (kizonDto.KdWeAmount == 0)
+ {
+ // 既存がゼロだったら更新
+ kizonDto.KdWeAmount = kdWeAmount;
+ }
+ else if (kizonDto.KdWeAmount != kdWeAmount)
+ {
+ // 既存と値が異なる場合、既存優先(更新しない)
+ LoggerUxer.Warn($"同一日同一コードでKDWE値が異なります(未更新)。[ライン名:{lineInfo.LineName},機種コード:{kihonBuban},日付:{weProductDate:yyyy/MM/dd},WE値①:{kizonDto.KdWeAmount},WE値②{kdWeAmount}] ①のまま。");
+ }
+ else
+ {
+ // 既存と値が同じ場合、何もしない
+ }
+ }
+ else
+ {
+ // 追加
+ list.Add(new WeOrderDto()
+ {
+ CreateRecordDate = now,
+ LineId = lineInfo.LineId,
+ LineName = lineInfo.LineName,
+ BasicPartsNo = kihonBuban,
+ WorkDate = weProductDate,
+ AfAmount = afAmount,
+ WeAmount = weAmount,
+ KdWeAmount = kdWeAmount,
+ ProductionLur = productionLur,
+ ModelCd = modelCd,
+ Derivation = derivation,
+ TactTime = tact,
+ });
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return true;
+ }
+
+ ///
+ /// Excelの「MC生産負荷(2交替)」の行番号取得
+ ///
+ /// シート
+ /// INIDIC
+ /// [出力]行番号(無効の場合-1)
+ /// 成否
+ private static bool GetMcSeisanFukaRow(IXLWorksheet sheet, Dictionary iniDic, out int retRow)
+ {
+ const string KEY_EXCEL_MC_SEISAN_FUKA_ENABLED = "ExcelMcSeisanFukaEnabled";
+ const string KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_COL = "ExcelMcSeisanFukaJudgeCol";
+ const string KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_VALUE_PATTERN = "ExcelMcSeisanFukaJudgeValuePattern";
+
+ retRow = -1;
+
+ var str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_MC_SEISAN_FUKA_ENABLED, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"MC生産負荷有効無効指定が未設定です。[キー:{KEY_EXCEL_MC_SEISAN_FUKA_ENABLED}]");
+ return false;
+ }
+
+ if (!bool.TryParse(str, out var isMcSeisanFukaEnabled))
+ {
+ LoggerUxer.Error($"MC生産負荷有効無効指定が無効値です。[キー:{KEY_EXCEL_MC_SEISAN_FUKA_ENABLED},値:{str}]");
+ return false;
+ }
+
+ if (!isMcSeisanFukaEnabled)
+ {
+ LoggerUxer.Info($"MC生産負荷は無効です。処理を継続します。");
+ return true;
+ }
+
+ str = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_COL, string.Empty);
+ if (string.IsNullOrEmpty(str))
+ {
+ LoggerUxer.Error($"MC生産負荷判定列が未設定です。[キー:{KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_COL}]");
+ return false;
+ }
+ if (!XlUxer.TryConvertColLetterToNumber(str, out var mcSeisanFukaRowJudgeCol))
+ {
+ LoggerUxer.Error($"MC生産負荷判定列の設定値が不正です。[{KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_COL}:{str}]");
+ return false;
+ }
+ LoggerUxer.Info($"[MC生産負荷判定列:{str}(番号:{mcSeisanFukaRowJudgeCol})]");
+
+ var mcSeisanFukaRowJudgeValuePattern = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_VALUE_PATTERN, string.Empty);
+ if (string.IsNullOrEmpty(mcSeisanFukaRowJudgeValuePattern))
+ {
+ LoggerUxer.Error($"設定ファイルのMC生産負荷行判定値パターンが未設定です。[キー:{KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_VALUE_PATTERN}]");
+ return false;
+ }
+
+ for (int row = 1; row <= 1000; row++)
+ {
+ // ワイルドカードマッチング
+ if (StringUxer.WildcardMatch(
+ sheet.Cell(row, mcSeisanFukaRowJudgeCol).GetFormattedString().Trim(),
+ mcSeisanFukaRowJudgeValuePattern))
+ {
+ retRow = row;
+ return true;
+ }
+ }
+ LoggerUxer.Error($"設定ファイルのMC生産負荷行が見つかりませんでした。[列:{mcSeisanFukaRowJudgeCol},判定値パターン:{mcSeisanFukaRowJudgeValuePattern}]");
+ return false;
+ }
+ private static bool TryGetYmFromText(string text, out DateTime? dt)
+ {
+ dt = null;
+
+ if (text.IndexOf("年") >= 0 && text.IndexOf("月") >= 0)
+ {
+ var pos = text.IndexOf("年");
+ var strNen = text.Substring(0, pos);
+ text = text.Substring(pos + "年".Length);
+ pos = text.IndexOf("月");
+ var strTsuki = text.Substring(0, pos);
+ // 2. TryParseを実行(成功したらdtに代入、失敗ならnullのまま)
+ if (DateTime.TryParse($"{strNen}/{strTsuki}/01", out var tempDt))
+ {
+ dt = tempDt; // ここで DateTime? に代入
+ return true;
+ }
+ else
+ {
+ dt = null;
+ return false;
+ }
+ }
+ else if (text.IndexOf("/") >= 0)
+ {
+ var pos = text.IndexOf("/");
+ var strNen = text.Substring(0, pos);
+ text = text.Substring(pos + "/".Length);
+ pos = text.IndexOf("/");
+ var strTsuki = string.Empty;
+ if (pos < 0)
+ {
+ strTsuki = text;
+ }
+ else
+ {
+ strTsuki = text.Substring(pos + "/".Length);
+ }
+ // 2. TryParseを実行(成功したらdtに代入、失敗ならnullのまま)
+ if (DateTime.TryParse($"{strNen}/{strTsuki}/01", out var tempDt))
+ {
+ dt = tempDt; // ここで DateTime? に代入
+ return true;
+ }
+ else
+ {
+ dt = null;
+ return false;
+ }
+ }
+ else return false;
+ }
+
+ private static int RunOneFileEazy(
+ string path,
+ DateTime now,
+ List checkItems,
+ Dictionary iniDic,
+ ExcelSettingsDto excelSettings,
+ DateTime fromDate,
+ DateTime? toDate,
+ LineIdHelper lineIdHelper,
+ List cdList,
+ List outList)
+ {
+ // INIキー定義
+ const string KEY_INCLUDED_SHEET_NAMES = "IncludedSheetNames";
+ const string KEY_EXCLUDED_SHEET_NAMES = "ExcludedSheetNames";
+
+ if (System.IO.Path.GetExtension(path).ToLower() != ".xlsx" &&
+ System.IO.Path.GetExtension(path).ToLower() != ".xlsm")
+ {
+ LoggerUxer.Warn($"拡張子が異なるためスキップします。[{path}]");
+ return (int)Common.RetCode.Success;
+ }
+
+ LoggerUxer.Info($"[ファイル:{path}]");
+
+ try
+ {
+ //using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
+ //using (var book = new XLWorkbook(fs))
+ using (var book = LoadWorkbookWithoutPhoneticError(path))
+ {
+ // 処理対象のシート名
+ var incSheetsCsv = DictionaryUxer.GetValueOrDefault(iniDic, KEY_INCLUDED_SHEET_NAMES, string.Empty);
+ if (!string.IsNullOrEmpty(incSheetsCsv))
+ {
+ LoggerUxer.Info($"[処理対象シート名:{incSheetsCsv}]");
+ }
+ else
+ {
+ LoggerUxer.Info($"[処理対象シート名:なし]");
+ }
+
+ // 処理対象外のシート名
+ var excSheetsCsv = DictionaryUxer.GetValueOrDefault(iniDic, KEY_EXCLUDED_SHEET_NAMES, string.Empty);
+ if (!string.IsNullOrEmpty(excSheetsCsv))
+ {
+ if (string.IsNullOrEmpty(incSheetsCsv))
+ {
+ LoggerUxer.Info($"[処理対象外シート名:{excSheetsCsv}]");
+ }
+ else
+ {
+ LoggerUxer.Warn($"処理対象シート名が指定されているため、処理対象外指定は無効になります。[キー:{KEY_EXCLUDED_SHEET_NAMES},値:{excSheetsCsv}]");
+ }
+ }
+ else
+ {
+ LoggerUxer.Info($"[処理対象外シート名:なし]");
+ }
+ // シートフィルタ作成
+ var incSheets = string.IsNullOrEmpty(incSheetsCsv) ? new string[] { } : incSheetsCsv.Split(',');
+ var excSheets = string.IsNullOrEmpty(excSheetsCsv) ? new string[] { } : excSheetsCsv.Split(',');
+ var sheetFilter = new SheetFilterUxer(incSheets, excSheets);
+
+ // シート右端から左へループ
+ for (int sheetIndex = book.Worksheets.Count; sheetIndex >= 1; sheetIndex--)
+ {
+ // シート取得
+ var sheet = book.Worksheet(sheetIndex);
+
+ if (!sheetFilter.CanPass(sheet.Name.Trim()))
+ {
+ // シート名フィルタに引っかからなかった時、飛ばす
+ LoggerUxer.Info($"対象外のシートをスキップします。[シート名:{sheet.Name}]");
+ continue;
+ }
+
+ // 条件を満たさないシートは飛ばす
+ if (CheckExcelSheet(sheet, checkItems) == false)
+ {
+ LoggerUxer.Info($"シート条件を満たさないためスキップします。[シート名:{sheet.Name}]");
+ continue;
+ }
+
+ LoggerUxer.Info($"[シート名:{sheet.Name}]");
+
+ // ラインID取得
+ if (!TryGetLineIdFromCell(sheet, iniDic, out var id))
+ {
+ return (int)Common.RetCode.ExcelLinesInfoGetError;
+ }
+ if (id > 0)
+ {
+ LoggerUxer.Info($"[ラインID:{id}]");
+ }
+ lineIdHelper.SheetLineId = id;
+
+ // 列定義にラインIDを入れる
+ SetLineIdToColumnDifinition(lineIdHelper.GetCurrentLineId(), cdList);
+
+ // モジュールID取得
+ var moduleId = -1;
+ if (lineIdHelper.GetCurrentLineId() > 0 &&
+ lineIdHelper.GetCurrentModuleId() < 0)
+ {
+ if (!GetModuleIdFromLineId(lineIdHelper.GetCurrentLineId(), out moduleId,out var messageForMe))
+ {
+ LoggerUxer.Error($"モジュールIDの取得に失敗しました。[ラインID:{lineIdHelper.GetCurrentLineId()},詳細:{messageForMe}]");
+ return (int)Common.RetCode.ExcelOneFileException;
+ }
+ }
+ if (moduleId > 0)
+ {
+ LoggerUxer.Info($"[モジュールID:{moduleId}]");
+ }
+
+ lineIdHelper.SheetModuleId = moduleId;
+
+ // 列定義にモジュールIDを入れる
+ SetModuleIdToColumnDifinition(moduleId, cdList);
+
+ // 日付情報取得
+ if (!GetDateList(sheet, fromDate, toDate, iniDic, out var dateDic))
+ {
+ return (int)Common.RetCode.ExcelDateCellGetError;
+ }
+
+ // 最大日が開始日より小さい場合、シートを飛ばす
+ if (dateDic.Count > 0 && dateDic.Values.Max() < fromDate)
+ {
+ LoggerUxer.Info($"シート最大日が開始日より前のためスキップします。[シート最大日:{(DateTime)(dateDic.Values.Max()):yyyy/MM/dd}]");
+ continue;
+ }
+
+ // データ取得
+ if (!GetDataEazy(sheet, now, dateDic, fromDate, iniDic, cdList, excelSettings, outList))
+ {
+ return (int)Common.RetCode.ExcelDataGetError;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LoggerUxer.Error($"1ファイル処理にてエラーが発生しました。[{ex.Message}]");
+ return (int)Common.RetCode.ExcelOneFileException;
+ }
+ return (int)Common.RetCode.Success;
+ }
+
+ // ライン判別とINI更新
+ private static bool LineHanteiFromFilePathAndReloadIni(
+ string path,
+ Dictionary iniDic,
+ string sectionName,
+ out int lineId,
+ out ExcelSettingsDto excelSettings,
+ out string resultMessage)
+ {
+ lineId = -1;
+ excelSettings = null;
+ resultMessage = string.Empty;
+
+ if (!TryGetLineIdFromFilePath(path, iniDic, out lineId))
+ {
+ resultMessage = "ファイル名からラインID取得に失敗しました。";
+ return false;
+ }
+ if (lineId == -1)
+ {
+ LoggerUxer.Info("ファイル名からラインIDは取得しませんでした。");
+ return true;
+ }
+
+ // Excel設定のロード
+ if (!LoadExcelSetting(iniDic, lineId, out excelSettings))
+ {
+ return false;
+ }
+ // INI読みに反映
+ IniHelper.IniList = excelSettings.IniList;
+
+ // INI取得しなおし(Excel設定で変化する)
+ foreach (var key in iniDic.Keys.ToList())
+ iniDic[key] = IniHelper.ReadValue(Common.INI_FILE_PATH, sectionName, key);
+ foreach (var iniDto in excelSettings.IniList
+ .Where(m => m.Section == sectionName)
+ .ToList())
+ iniDic[iniDto.Key] = IniHelper.ReadValue(Common.INI_FILE_PATH, sectionName, iniDto.Key);
+ return true;
+ }
+
+ ///
+ /// ラインIDからモジュールIDを取得する
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static bool GetModuleIdFromLineId(
+ int lineId,
+ out int moduleId,
+ out string resultMessage)
+ {
+ resultMessage = string.Empty;
+ moduleId = -1;
+ var path = ".\\LineIdModuleId.csv";
+ if (!CsvUxer.TryGetDictionaryFromCsv(path, out var dic,out var messageForMe))
+ {
+ resultMessage = $"モジュールIDの取得に失敗しました。[詳細:{messageForMe}]";
+ return false;
+ }
+ if (dic.ContainsKey(lineId.ToString()))
+ {
+ moduleId = int.TryParse(dic[lineId.ToString()], out var intVal) ? intVal : moduleId;
+ }
+ return true;
+ }
+
+ // Excel設定のロード
+ private static bool LoadExcelSetting(DictionaryiniDic, int lineId, out ExcelSettingsDto settingsDto)
+ {
+ const string INI_KEY_EXCEL_SETTING_FILE_BY_LINE_ID = "ExcelSettingFileByLineId";
+
+ settingsDto = new ExcelSettingsDto();
+
+ var esfbli = DictionaryUxer.GetValueOrDefault(iniDic, INI_KEY_EXCEL_SETTING_FILE_BY_LINE_ID, string.Empty);
+ if (string.IsNullOrEmpty(esfbli))
+ {
+ LoggerUxer.Error($"Excel設定ファイルは未定義です。[キー:{INI_KEY_EXCEL_SETTING_FILE_BY_LINE_ID}]");
+ return false;
+ }
+ var defs = esfbli.Trim().Split('|');
+ foreach (var def in defs)
+ {
+ var items = def.Trim().Split(',');
+ if (items.Length != 2)
+ {
+ LoggerUxer.Error($"Excel設定ファイルの定義が不正です(カンマ区切り)。[{INI_KEY_EXCEL_SETTING_FILE_BY_LINE_ID}:{esfbli}]");
+ return false;
+ }
+ if (items[0].Trim() == lineId.ToString())
+ {
+ var path = items[1].Trim();
+ if (!path.StartsWith(".\\"))
+ {
+ if (path.StartsWith("\\"))
+ {
+ path = "." + path;
+ }
+ else
+ {
+ path = ".\\" + path;
+ }
+ }
+ if (!File.Exists(path))
+ {
+ LoggerUxer.Error($"Excel設定ファイルが存在しません。[{INI_KEY_EXCEL_SETTING_FILE_BY_LINE_ID}:{esfbli},ラインID:{lineId}]");
+ return false;
+ }
+
+ using (var book = LoadWorkbookWithoutPhoneticError(path))
+ {
+ if (book.Worksheets.Contains("設定"))
+ {
+ // 設定シートがあった時だけ読む
+ var sheet = book.Worksheet("設定");
+ var tobashiCnt = 0;
+ for (var row = 1; row<1000;row++)
+ {
+ var text = sheet.Cell(row, 1).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(text) || !text.All(c => c <= 127))
+ {
+ // A列値が空欄または英数字以外もあるとき、無効行とみなす
+ tobashiCnt++;
+ if (tobashiCnt > 10)
+ {
+ // おわり
+ break;
+ }
+ continue;
+ }
+ settingsDto.IniList.Add(new IniDto()
+ {
+ Section = text,
+ Key = sheet.Cell(row, 2).GetFormattedString().Trim(),
+ Value = sheet.Cell(row, 3).GetFormattedString().Trim(),
+ });
+ }
+ }
+
+ // その他のシート
+ foreach (var sheet in book.Worksheets
+ .Where(m => m.Name != "設定"))
+ {
+ var tobashiCnt = 0;
+ Dictionary dic = new Dictionary();
+ for (var row = 2; row < 1000; row++)
+ {
+ var textA = sheet.Cell(row, 1).GetFormattedString().Trim();
+ var textB = sheet.Cell(row, 2).GetFormattedString().Trim();
+ if (string.IsNullOrEmpty(textA) /*|| !textB.All(c => c <= 127)*/)
+ {
+ // A列値が空欄またはB列値に英数字以外もあるとき、無効行とみなす
+ tobashiCnt++;
+ if (tobashiCnt > 10)
+ {
+ // おわり
+ break;
+ }
+ continue;
+ }
+ dic.Add(textA, textB);
+ }
+ settingsDto.KVPDic.Add(sheet.Name, dic);
+ }
+ }
+ break;
+ }
+ }
+ return true;
+ }
+
+ ///
+ /// ラインIDを列定義リストに入れ込む
+ ///
+ ///
+ ///
+ private static void SetLineIdToColumnDifinition(
+ int lineId,
+ List cdList)
+ {
+ foreach (var cd in cdList)
+ {
+ if (cd.Type == ColumnType.LineId)
+ {
+ cd.FixedValue = lineId < 1 ? string.Empty : lineId.ToString();
+ }
+ }
+ }
+
+ ///
+ /// モジュールIDを列定義リストに入れ込む
+ ///
+ ///
+ ///
+ private static void SetModuleIdToColumnDifinition(
+ int moduleId,
+ List cdList)
+ {
+ foreach (var cd in cdList)
+ {
+ if (cd.Type == ColumnType.ModuleId)
+ {
+ cd.FixedValue = moduleId < 1 ? string.Empty : moduleId.ToString();
+ }
+ }
+ }
+
+ private static XLWorkbook LoadWorkbookWithoutPhoneticError(string filePath)
+ {
+ var ms = new MemoryStream();
+ using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ {
+ fs.CopyTo(ms);
+ }
+
+ ms.Position = 0;
+ using (var archive = new ZipArchive(ms, ZipArchiveMode.Update, true))
+ {
+ var entry = archive.GetEntry("xl/sharedStrings.xml");
+ if (entry != null)
+ {
+ string content;
+ // 1. まず読み込む(usingで確実にStreamを閉じる)
+ using (var sr = new StreamReader(entry.Open()))
+ {
+ content = sr.ReadToEnd();
+ }
+
+ // 2. 正規表現でふりがなタグを削除
+ var fixedContent = Regex.Replace(content, @"]*>.*?", "");
+
+ // 3. 内容を書き換える(Deleteせずに、再度Openして先頭から上書き)
+ // Updateモードなので、Open() して書き込むと上書きされます
+ using (var sw = new StreamWriter(entry.Open(), System.Text.Encoding.UTF8))
+ {
+ // ストリームの長さを0にしてから書き込む(古い内容が残らないように)
+ sw.BaseStream.SetLength(0);
+ sw.Write(fixedContent);
+ }
+ }
+ }
+
+ ms.Position = 0;
+ return new XLWorkbook(ms);
+ }
+ }
+ public class FuncExcelToCsvWeOrderByIniResultDto : IFuncResultDto
+ {
+ public bool Succeeded { get; set; } = false;
+ public int ExitCode { get; set; } = 0;
+ public string ResultMessage { get; set; } = string.Empty;
+ }
+
+ ///
+ /// 書式つきテキストパターンDTO
+ ///
+ public class FormattedTextPatternDto
+ {
+ public string ColumnName { get; set; } = string.Empty;
+ public string JudgeValue { get; set; } = string.Empty;
+ public string FileName { get; set; } = string.Empty;
+ public string Format { get; set; } = string.Empty;
+ }
+
+ ///
+ /// Excel設定
+ ///
+ public class ExcelSettingsDto
+ {
+ public List IniList { get; set; } = new List();
+ public Dictionary> KVPDic { get; set; } = new Dictionary>();
+ }
+
+ public class LineIdHelper
+ {
+ private const int ID_NOTHING = -1;
+
+ // --- File階層 ---
+ private int _fileLineId = ID_NOTHING;
+ public int FileLineId
+ {
+ private get => _fileLineId; // クラス内からだけ読める
+ set
+ {
+ _fileLineId = value;
+ FileModuleId = ID_NOTHING;
+ SheetLineId = ID_NOTHING; // 下位を連鎖リセット
+ }
+ }
+ public int FileModuleId { private get; set; } = ID_NOTHING;
+
+ // --- Sheet階層 ---
+ private int _sheetLineId = ID_NOTHING;
+ public int SheetLineId
+ {
+ private get => _sheetLineId;
+ set
+ {
+ _sheetLineId = value;
+ SheetModuleId = ID_NOTHING;
+ RowLineId = ID_NOTHING; // 下位を連鎖リセット
+ }
+ }
+ public int SheetModuleId { private get; set; } = ID_NOTHING;
+
+ // --- Row階層 ---
+ private int _rowLineId = ID_NOTHING;
+ public int RowLineId
+ {
+ private get => _rowLineId;
+ set
+ {
+ _rowLineId = value;
+ RowModuleId = ID_NOTHING; // 最下層なのでここでストップ
+ }
+ }
+ public int RowModuleId { private get; set; } = ID_NOTHING;
+
+
+ // 🔓 唯一の公開出口:最も深い階層のIDを賢く判定
+ public int GetCurrentLineId()
+ {
+ if (RowLineId != ID_NOTHING) return RowLineId;
+ if (SheetLineId != ID_NOTHING) return SheetLineId;
+ return FileLineId;
+ }
+
+ public int GetCurrentModuleId()
+ {
+ if (RowLineId != ID_NOTHING) return RowModuleId;
+ if (SheetLineId != ID_NOTHING) return SheetModuleId;
+ return FileModuleId;
+ }
+ }
+
+ public class KaniChuzoLpdcJissekiNyuryokuDto
+ {
+ public DateTime Date { get; set; } = DateTime.MinValue;
+ public string Kishu { get; set; } = string.Empty;
+ public int Suryo { get; set; } = -1;
+ public int Furyo { get; set; } = -1;
+ public string Hensu { get; set; } = string.Empty;
+ }
+ public class KaniChuzoLpdcChuzoInDto
+ {
+ public string Kishu { get; set; } = string.Empty;
+ public string Buban { get; set; } = string.Empty;
+ public string Kubun { get; set; } = string.Empty;
+ public DateTime Date { get; set; } = DateTime.MinValue;
+ public int Su { get; set; } = -1;
+ }
+ public class KaniChuzoLpdcChuzoInDto
+}
diff --git a/src/ExcelToCsvToDb/Commons/Common.cs b/src/ExcelToCsvToDb/Commons/Common.cs
new file mode 100644
index 0000000..502d761
--- /dev/null
+++ b/src/ExcelToCsvToDb/Commons/Common.cs
@@ -0,0 +1,474 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace ExcelToCsvToDb.Commons
+{
+ ///
+ /// 共通
+ ///
+ public static class Common
+ {
+ #region 定数
+
+ #region 起動時引数
+
+ //OLD
+ /////
+ ///// 起動時引数:処理区分:溶接加工計画
+ /////
+ //public const string KIDOU_PARA_PROC_WE_ORDER = "/WEORDER";
+ /////
+ ///// 起動時引数:機能区分:Excel To CSV
+ /////
+ //public const string KIDOU_PARA_FUNC_EXCEL_TO_CSV = "/EXCELTOCSV";
+ /////
+ ///// 起動時引数:機能区分:CSV To DB
+ /////
+ //public const string KIDOU_PARA_FUNC_CSV_TO_DB = "/CSVTODB";
+ //OLD
+
+ #endregion
+
+ #region メインPJ固有ステップ
+
+ ///
+ /// メイン固有ステップ:Excel→CSV(WE生産計画)
+ ///
+ public const string MAINPJ_KOYU_STEP_NAME_EXCEL_TO_CSV_WEORDER = "EXCELTOCSV_WEORDER";
+
+ ///
+ /// メイン固有ステップ:Excel→CSV(簡易)
+ ///
+ public const string MAINPJ_KOYU_STEP_NAME_EXCEL_TO_CSV_EAZY = "EXCELTOCSV_EAZY";
+
+ #endregion
+
+ #region 戻り値(プロセス終了値)
+
+ ///
+ /// 戻り値(プロセス終了値)
+ ///
+ public enum RetCode
+ {
+ ///
+ /// 正常終了
+ ///
+ Success = 0,
+
+ ///
+ /// メイン:起動時引数不足エラー
+ ///
+ ExecuteParameterCountError = 1,
+
+ ///
+ /// メイン:INIステップ情報の形式が不正
+ ///
+ IniStepInfoFormatError = 2,
+
+ ///
+ /// メイン:ステップ機能エラー
+ ///
+ StepFunctionError = 3,
+
+ ///
+ /// メイン:ステップリストエラー
+ ///
+ StepListError = 4,
+
+ ///
+ /// メイン:INIファイルパスエラー
+ ///
+ IniFiilePathError = 5,
+
+ ///
+ /// ExcelToCsvWe:開始日エラー
+ ///
+ StartDateError = 1001,
+
+ ///
+ /// ExcelToCsvWe:入力フォルダパスエラー
+ ///
+ InFolderPathError = 1002,
+
+ ///
+ /// ExcelToCsvWe:対象ファイル群取得エラー
+ ///
+ TargetFilesGetError = 1003,
+
+ ///
+ /// ExcelToCsvWe:CSV出力時エラー
+ ///
+ ExportToCsvError = 1004,
+
+ ///
+ /// ExcelToCsvWe:CSVファイル名が未設定
+ ///
+ CsvFileNameNotSetting = 1005,
+
+ ///
+ /// ExcelToCsvWe:Excelシートチェック項目不正
+ ///
+ ExcelSheelCheckItemInvalid = 1006,
+
+ ///
+ /// ExcelToCsvWe:Excel→CSV処理時に例外発生
+ ///
+ ExcelToCsvException = 1007,
+
+ ///
+ /// ExcelToCsvWe:Excel日付セル取得エラー
+ ///
+ ExcelDateCellGetError = 1008,
+
+ ///
+ /// ExcelToCsvWe:Excelデータ取得エラー
+ ///
+ ExcelDataGetError = 1009,
+
+ ///
+ /// ExcelToCsvWe:Excelファイル処理時に例外発生
+ ///
+ ExcelOneFileException = 1010,
+
+ ///
+ /// ExcelToCsvWe:Excelライン(複数)情報取得エラー
+ ///
+ ExcelLinesInfoGetError = 1011,
+
+ ///
+ /// ExcelToCsvWe:アイテムとExcel列マッピングエラー
+ ///
+ CreateItemExcelColumnMappingDicError = 1012,
+
+ ///
+ /// ExcelToCsvWe:設定ファイル設定値エラー
+ ///
+ ConfigError = 1013,
+
+ ///
+ /// ExcelToCsvWe:終了日エラー
+ ///
+ EndDateError = 1014,
+
+ ///
+ /// Excel設定エラー
+ ///
+ ExcelSettingsError = 1015,
+
+ ///
+ /// 簡易特殊処理エラー
+ ///
+ KaniTokushuError = 1016,
+ }
+
+ #endregion
+
+ #region ファイル・フォルダ
+
+ ///
+ /// SQLフォルダパス
+ ///
+ public const string SQL_FOLDER_PATH = "SQL";
+
+ #endregion
+
+ #region INIファイル
+
+ #region ファイルパス
+
+ ///
+ /// INIファイル名
+ ///
+ public const string INI_FILE_NAME = "setting.ini";
+
+ ///
+ /// INIファイルパス(実行後に動的に設定される)
+ ///
+ public static string INI_FILE_PATH = string.Empty;
+
+ #endregion
+
+ #region セクション名
+
+ /////
+ ///// セクション名:CSV to DB
+ /////
+ //public const string INI_SECTION_CSVTODB = "CsvToDb";
+
+ /////
+ ///// セクション名:SFTP
+ /////
+ //public const string INI_SECTION_SFTP = "SFTP";
+
+ /////
+ ///// セクション名:バックアップ
+ /////
+ //public const string INI_SECTION_BACKUP = "Backup";
+
+ #endregion
+
+ #region 共通セクションのキー
+
+ /////
+ ///// キー名:タイトル
+ /////
+ //public const string INI_KEY_TITLE = "Title";
+
+ /////
+ ///// CSVエンコーディング名
+ /////
+ //public const string INI_KEY_CSV_ENCODING = "CsvEncoding";
+
+ #endregion
+
+ #region ExcelToCsvセクションのキー
+
+ /////
+ ///// キー名:入力フォルダー
+ /////
+ //public const string INI_KEY_IN_FOLDER = "InFolder";
+
+ /////
+ ///// キー名:入力ファイル名(ワイルドカード指定あり)
+ /////
+ //public const string INI_KEY_IN_FILE_NAME = "InFileName";
+
+ /////
+ ///// キー名:Excelシートチェック項目
+ ///// 行,列,値|行,列,値|...
+ ///// 行と列は1オリジン
+ /////
+ //public const string INI_KEY_EXCEL_SHEET_CHECK_ITEMS = "ExcelSheetCheckItems";
+
+ /////
+ ///// キー名:ライン判定列番号(1オリジン)
+ /////
+ //public const string INI_KEY_EXCEL_LINE_JUDGE_COL = "ExcelLineJudgeCol";
+
+ /////
+ ///// キー名:日付行番号(1オリジン)
+ /////
+ //public const string INI_KEY_EXCEL_DATE_ROW = "ExcelDateRow";
+
+ /////
+ ///// キー名:日付行開始列番号(1オリジン)
+ /////
+ //public const string INI_KEY_EXCEL_DATE_ROW_START_COL = "ExcelDateRowStartCol";
+
+ /////
+ ///// キー名:日付行終了値
+ /////
+ //public const string INI_KEY_EXCEL_DATE_ROW_END_VALUE = "ExcelDateRowEndValue";
+
+ /////
+ ///// キー名:データ終了判定列番号(1オリジン)
+ /////
+ //public const string INI_KEY_EXCEL_DATA_END_JUDGE_COL = "ExcelDataEndJudgeCol";
+
+ /////
+ ///// キー名:データ終了判定値
+ /////
+ //public const string INI_KEY_EXCEL_DATA_END_JUDGE_VALUE = "ExcelDataEndJudgeValue";
+
+ /////
+ ///// キー名:非表示行の扱い
+ ///// skip/include/warn(ログ出し+skip)
+ /////
+ //public const string INI_KEY_EXCEL_HIDDEN_ROW_HANDLING = "ExcelHiddenRowHandling";
+
+ /////
+ ///// キー名:MC生産負荷行判定列番号(1オリジン)
+ /////
+ //public const string INI_KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_COL = "ExcelMcSeisanFukaRowJudgeCol";
+
+ /////
+ ///// キー名:MC生産負荷行判定値(パターン)
+ /////
+ //public const string INI_KEY_EXCEL_MC_SEISAN_FUKA_JUDGE_VALUE_PATTERN = "ExcelMcSeisanFukaRowJudgeValuePattern";
+ /////
+ ///// キー名:AF/WE列番号(1オリジン)
+ /////
+ //public const string INI_KEY_EXCEL_AF_WE_COL = "ExcelAfWeCol";
+
+ /////
+ ///// キー名:開始日オフセット(加算日数)
+ /////
+ //public const string INI_KEY_DAYS_TO_START_OFFSET = "DaysToStartOffset";
+
+ /////
+ ///// キー名:CSV保存一時フォルダパス
+ /////
+ //public const string INI_KEY_CSV_TEMP_FOLDER = "CsvTempFolder";
+
+ /////
+ ///// キー名:CSVファイル名(WE生産計画)
+ /////
+ //public const string INI_KEY_CSV_FILE_NAME_WE_ORDER = "CsvFileNameWeOrder";
+
+ /////
+ ///// キー名:ファイル名のプレフィックス(日時フォーマット)
+ /////
+ //public const string INI_KEY_FILE_DT_PREFIX = "FileDtPrefix";
+
+ /////
+ ///// キー名:ファイル名のサフィックス(日時フォーマット)
+ /////
+ //public const string INI_KEY_FILE_DT_SUFFIX = "FileDtSuffix";
+
+ /////
+ ///// キー名:名前→ID変換リスト(ライン用)
+ /////
+ //public const string INI_KEY_NAME_TO_ID_LIST_FOR_LINE = "NameToIdListForLine";
+
+ #endregion
+
+ #region CsvToDbセクションのキー
+
+ /////
+ ///// キー名:CSVファイル名パターン(カンマ区切り複数指定)
+ /////
+ //public const string INI_KEY_CSV_FILE_NAME_PATTERNS = "CsvFileNamePatterns";
+
+ /////
+ ///// キー名:INSERTのSQLファイル名(カンマ区切り複数指定)
+ /////
+ //public const string INI_KEY_INSERT_SQL_FILES = "InsertSqlFiles";
+
+ /////
+ ///// キー名:重複チェックSQLファイル名(カンマ区切り複数指定)
+ /////
+ //public const string INI_KEY_DUP_CHECK_SQL_FILES = "DupCheckSqlFiles";
+
+ /////
+ ///// キー名:挿入前削除SQLファイル名(カンマ区切り複数指定)
+ /////
+ //public const string INI_KEY_DELETE_BEFORE_INSERT_SQL_FILES = "DeleteBeforeInsertSqlFiles";
+
+ /////
+ ///// キー名:SFTPダウンロード後のアクション
+ ///// ("DELETE":ダウンロード元ファイルの削除)
+ /////
+ //public const string INI_KEY_ACTION_AFTER_SFTP_DOWNLOAD = "ActionAfterSFTPDownload";
+
+ /////
+ ///// キー名:SFTPアップロード後のアクション
+ ///// ("CLEANUP":アップロード元フォルダのクリーンナップ)
+ /////
+ //public const string INI_KEY_ACTION_AFTER_SFTP_UPLOAD = "ActionAfterSFTPUpload";
+
+ /////
+ ///// キー名:DBのプロバイダ名
+ /////
+ //public const string INI_KEY_DB_PROVIDER_NAME = "DbProviderName";
+
+ /////
+ ///// キー名:DBの接続文字列
+ /////
+ //public const string INI_KEY_DB_CONNECTION_STRING = "DbConnectionString";
+
+ /////
+ ///// キー名:DB登録後の処理
+ ///// "DELETE":ローカルCSVの削除
+ ///// "BACKUP":ローカルCSVのバックアップ
+ /////
+ //public const string INI_KEY_ACTION_AFTER_DB_REGIST = "ActionAfterDbRegist";
+
+ /////
+ ///// キー名:CSVバックアップフォルダパス
+ /////
+ //public const string INI_KEY_CSV_BACKUP_FOLDER = "CsvBackupFolder";
+
+ /////
+ ///// キー名:CSVバックアップ:最大日数
+ /////
+ //public const string INI_KEY_CSV_BACKUP_MAX_DAYS = "CsvBackupMaxDays";
+
+ /////
+ ///// キー名:CSVバックアップ:最大ファイル数
+ /////
+ //public const string INI_KEY_CSV_BACKUP_MAX_FILE_COUNT = "CsvBackupMaxFileCount";
+
+ #endregion
+
+ #region SFTPセクションのキー
+
+ ///
+ /// キー名:ホスト名(またはIPアドレス)
+ ///
+ //public const string INI_KEY_SFTP_HOST = "Host";
+
+ /////
+ ///// キー名:ポート番号
+ /////
+ //public const string INI_KEY_SFTP_PORT = "Port";
+
+ /////
+ ///// キー名:ユーザ名
+ /////
+ //public const string INI_KEY_SFTP_USER_NAME = "UserName";
+
+ /////
+ ///// キー名:プライベートキーファイルパス
+ /////
+ //public const string INI_KEY_SFTP_PRIVATE_KEY_FILE_PATH = "PrivateKeyFilePath";
+
+ /////
+ ///// キー名:パスフレーズ(暗号化済み)
+ /////
+ //public const string INI_KEY_SFTP_PASS_PHRASE = "PassPhrase";
+
+ ///////
+ /////// キー名:リモートパス
+ ///////
+ ////public const string INI_KEY_SFTP_REMOTE_PATH = "RemotePath";
+
+ #endregion
+
+ #endregion
+
+ #region オプションアクション
+
+ /////
+ ///// オプションアクション:削除
+ /////
+ //public const string OPTION_ACTION_DELETE = "DELETE";
+
+ /////
+ ///// オプションアクション:バックアップ
+ /////
+ //public const string OPTION_ACTION_BACKUP = "BACKUP";
+
+ /////
+ ///// オプションアクション:クリーンナップ
+ /////
+ //public const string OPTION_ACTION_CLEANUP = "CLEANUP";
+
+ #endregion
+
+ #region 非表示行の扱い
+
+ ///
+ /// 非表示行の扱い:スキップ(処理対象外)
+ ///
+ //public const string HIDDEN_ROW_HANDLING_SKIP = "skip";
+
+ ///
+ /// 非表示行の扱い:処理対象
+ ///
+ //public const string HIDDEN_ROW_HANDLING_INCLUDE = "include";
+
+ ///
+ /// 非表示行の扱い:ワーニング(警告ログしスキップ)
+ ///
+ //public const string HIDDEN_ROW_HANDLING_WARN = "warn";
+
+ #endregion
+
+ #endregion
+ }
+}
diff --git a/src/ExcelToCsvToDb/DTO/ExcelLineDto.cs b/src/ExcelToCsvToDb/DTO/ExcelLineDto.cs
new file mode 100644
index 0000000..6ef5c51
--- /dev/null
+++ b/src/ExcelToCsvToDb/DTO/ExcelLineDto.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ExcelToCsvToDb.DTO
+{
+ public class ExcelLineDto
+ {
+ public int LineId { get; set; } = -1;
+ public string LineName { get; set; } = string.Empty;
+ public string ShiftName { get; set; } = string.Empty;
+ public int DataStartRow { get; set; } = 0;
+ public int LineCol { get; set; } = 0;
+ }
+}
diff --git a/src/ExcelToCsvToDb/DTO/ExcelSheetCheckDto.cs b/src/ExcelToCsvToDb/DTO/ExcelSheetCheckDto.cs
new file mode 100644
index 0000000..82cce6c
--- /dev/null
+++ b/src/ExcelToCsvToDb/DTO/ExcelSheetCheckDto.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ExcelToCsvToDb.DTO
+{
+ ///
+ /// Excelシートのチェック(対象のシートかどうか)
+ ///
+ public class ExcelSheetCheckDto
+ {
+ ///
+ /// チェック項目内のORのデリミタ
+ ///
+ public const string OR_DELIMITER = "[or]";
+
+ public List a1AddressList { get; set; } = new List();
+ public List CheckValueList { get; set; } = new List();
+ }
+}
diff --git a/src/ExcelToCsvToDb/DTO/TactManagementDto.cs b/src/ExcelToCsvToDb/DTO/TactManagementDto.cs
new file mode 100644
index 0000000..b0f94ea
--- /dev/null
+++ b/src/ExcelToCsvToDb/DTO/TactManagementDto.cs
@@ -0,0 +1,57 @@
+//using ExcelToCsvToDb.Commons;
+//using KssSmaPlaLib.Exchange.Interfaces;
+//using KssSmaPlaLib.IO.File;
+//using System;
+//using System.Collections.Generic;
+//using System.Linq;
+//using System.Text;
+//using System.Threading.Tasks;
+//using System.Xml.Linq;
+
+//namespace ExcelToCsvToDb.DTO
+//{
+// ///
+// /// タクト管理テーブルDTO
+// ///
+// public class TactManagementDto : ICsvExportableUxer
+// {
+// public int TactIndex { get; set; } = -1;
+// public int LineId { get; set; } = -1;
+// public string ModelCd { get; set; } = string.Empty;
+// public string BasicPartsNo { get; set; } = string.Empty;
+// public string Derivation { get; set; } = string.Empty;
+// public int Tact { get; set; } = -1;
+
+// public string CsvHeader => CsvUxer.Join("tact_index", "line_id", "model_cd", "basic_parts_no", "derivation", "tact");
+
+// public string ToCsvLine() => CsvUxer.Join(TactIndex, LineId, ModelCd, BasicPartsNo, Derivation, Tact);
+
+// ///
+// /// 内容は同一か?
+// ///
+// ///
+// ///
+// public bool IsSame(TactManagementDto dto)
+// {
+// return
+// dto.LineId == this.LineId &&
+// dto.ModelCd == this.ModelCd &&
+// dto.BasicPartsNo == this.BasicPartsNo &&
+// dto.Derivation == this.Derivation &&
+// dto.Tact == this.Tact;
+// }
+
+// public static int AddToList(List list, TactManagementDto dto)
+// {
+// // リストに同じ内容のDTOがあるか?あった場合そのタクトインデックスを返す
+// var existDto = list.FirstOrDefault(m => m.IsSame(dto));
+// if (existDto != null) return existDto.TactIndex;
+
+// // 新規タクトインデックスを設定しリストに追加
+// dto.TactIndex = list.Count;
+// list.Add(dto);
+
+// return dto.TactIndex;
+// }
+// }
+//}
diff --git a/src/ExcelToCsvToDb/DTO/WeOrderDto.cs b/src/ExcelToCsvToDb/DTO/WeOrderDto.cs
new file mode 100644
index 0000000..c32f794
--- /dev/null
+++ b/src/ExcelToCsvToDb/DTO/WeOrderDto.cs
@@ -0,0 +1,63 @@
+using DocumentFormat.OpenXml.Office.CoverPageProps;
+using KssSmaPlaLib.DtoMapping.Attributes;
+using KssSmaPlaLib.Exchange.Interfaces;
+using KssSmaPlaLib.IO.File;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ExcelToCsvToDb.DTO
+{
+ ///
+ /// WE生産計画詳細テーブルDTO
+ ///
+ public class WeOrderDto : ICsvExportableUxer
+ {
+ public DateTime CreateRecordDate { get; set; } = DateTime.Now;
+ public int LineId { get; set; } = -1;
+ public string LineName { get; set; } = string.Empty;
+ [ExcelColumnLetter("D")]
+ public string BasicPartsNo { get; set; } = string.Empty;
+ public DateTime WorkDate { get; set; } = DateTime.Now;
+ public int AfAmount { get; set; } = -1;
+ public int WeAmount { get; set; } = -1;
+ public int KdWeAmount { get; set; } = -1;
+ public int? ProductionLur { get; set; } = -1;
+ [ExcelColumnLetter("C")]
+ public string ModelCd { get; set; } = string.Empty;
+ [ExcelColumnLetter("E")]
+ public string Derivation { get; set; } = string.Empty;
+ [ExcelColumnLetter("F")]
+ public int TactTime { get; set; } = -1;
+
+ public string CsvHeader => CsvUxer.Join(
+ "create_record_date",
+ "line_id",
+ "line_name",
+ "basic_parts_no",
+ "work_date",
+ "af_amount",
+ "we_amount",
+ "kd_we_amount",
+ "production_lur",
+ "model_cd",
+ "derivation",
+ "tact_time");
+
+ public string ToCsvLine() => CsvUxer.Join(
+ CreateRecordDate,
+ LineId,
+ LineName,
+ BasicPartsNo,
+ WorkDate,
+ AfAmount,
+ WeAmount,
+ KdWeAmount,
+ ProductionLur,
+ ModelCd,
+ Derivation,
+ TactTime);
+ }
+}
diff --git a/src/ExcelToCsvToDb/ExcelToCsvToDb.csproj b/src/ExcelToCsvToDb/ExcelToCsvToDb.csproj
new file mode 100644
index 0000000..c12099d
--- /dev/null
+++ b/src/ExcelToCsvToDb/ExcelToCsvToDb.csproj
@@ -0,0 +1,190 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}
+ Exe
+ ExcelToCsvToDb
+ ExcelToCsvToDb
+ v4.8
+ 512
+ true
+ true
+
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ packages\BouncyCastle.Cryptography.2.5.1\lib\net461\BouncyCastle.Cryptography.dll
+
+
+ packages\ClosedXML.0.105.0\lib\netstandard2.0\ClosedXML.dll
+
+
+ packages\ClosedXML.Parser.2.0.0\lib\netstandard2.0\ClosedXML.Parser.dll
+
+
+ packages\DocumentFormat.OpenXml.3.1.1\lib\net46\DocumentFormat.OpenXml.dll
+
+
+ packages\DocumentFormat.OpenXml.Framework.3.1.1\lib\net46\DocumentFormat.OpenXml.Framework.dll
+
+
+ packages\ExcelNumberFormat.1.1.0\lib\net20\ExcelNumberFormat.dll
+
+
+ packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll
+
+
+ packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll
+
+
+ packages\Microsoft.Extensions.DependencyInjection.Abstractions.8.0.2\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll
+
+
+ packages\Microsoft.Extensions.Logging.Abstractions.8.0.3\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll
+
+
+ packages\Microsoft.IO.RecyclableMemoryStream.3.0.1\lib\netstandard2.0\Microsoft.IO.RecyclableMemoryStream.dll
+
+
+
+ packages\RBush.Signed.4.0.0\lib\net47\RBush.dll
+
+
+ packages\SixLabors.Fonts.1.0.0\lib\netstandard2.0\SixLabors.Fonts.dll
+
+
+
+ packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll
+
+
+ packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll
+
+
+
+
+
+ packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll
+
+
+
+
+ packages\System.Formats.Asn1.8.0.2\lib\net462\System.Formats.Asn1.dll
+
+
+
+ packages\System.Memory.4.5.5\lib\net461\System.Memory.dll
+
+
+
+ packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll
+
+
+ packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll
+
+
+
+ packages\System.Security.Cryptography.Xml.8.0.2\lib\net462\System.Security.Cryptography.Xml.dll
+
+
+ packages\System.Threading.Channels.8.0.0\lib\net462\System.Threading.Channels.dll
+
+
+ packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll
+
+
+ packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+ PreserveNewest
+
+
+
+
+ {4136ce96-10aa-4b55-b49f-68c80e9e3bc8}
+ KssSmaPlaLib
+
+
+ {9F267A81-8387-46F7-A299-CFC26216F895}
+ ExcelToCsvToDbCommon
+
+
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+
+
+
+
+ このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。
+
+
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDb/ExcelToCsvToDb.sln b/src/ExcelToCsvToDb/ExcelToCsvToDb.sln
new file mode 100644
index 0000000..f3fd27d
--- /dev/null
+++ b/src/ExcelToCsvToDb/ExcelToCsvToDb.sln
@@ -0,0 +1,37 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36119.2
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExcelToCsvToDb", "ExcelToCsvToDb.csproj", "{6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KssSmaPlaLib", "..\..\..\SharedLibs\KssSmaPlaLib\KssSmaPlaLib.csproj", "{4136CE96-10AA-4B55-B49F-68C80E9E3BC8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExcelToCsvToDbCommon", "..\ExcelToCsvToDbCommon\ExcelToCsvToDbCommon.csproj", "{9F267A81-8387-46F7-A299-CFC26216F895}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {09A5351C-5B78-4952-AF19-C0C7E615B31A}
+ EndGlobalSection
+EndGlobal
diff --git a/src/ExcelToCsvToDb/LineIdModuleId.csv b/src/ExcelToCsvToDb/LineIdModuleId.csv
new file mode 100644
index 0000000..18aec82
--- /dev/null
+++ b/src/ExcelToCsvToDb/LineIdModuleId.csv
@@ -0,0 +1,54 @@
+1,1
+2,1
+3,1
+4,1
+5,1
+6,1
+7,2
+8,2
+9,2
+10,2
+11,2
+12,2
+13,2
+14,2
+15,2
+16,2
+17,2
+18,3
+19,3
+20,3
+21,3
+22,3
+23,3
+24,3
+25,3
+26,3
+27,4
+28,4
+29,4
+30,4
+31,4
+32,4
+33,4
+34,7
+35,7
+36,7
+37,7
+44,6
+45,6
+46,6
+47,6
+48,6
+49,6
+50,6
+51,6
+52,6
+53,6
+54,7
+55,7
+57,6
+58,6
+64,6
+65,6
+66,6
diff --git a/src/ExcelToCsvToDb/Program.cs b/src/ExcelToCsvToDb/Program.cs
new file mode 100644
index 0000000..c7ed5f0
--- /dev/null
+++ b/src/ExcelToCsvToDb/Program.cs
@@ -0,0 +1,151 @@
+using ExcelToCsvToDb.BusinessLogic;
+using ExcelToCsvToDb.Commons;
+using KssSmaPlaLib.Batch.Dispatch;
+using KssSmaPlaLib.Batch.Interface;
+using KssSmaPlaLib.Batch.Log;
+using KssSmaPlaLib.Batch.StepInfo;
+using KssSmaPlaLib.Commons;
+using KssSmaPlaLib.Encryption;
+using KssSmaPlaLib.Ini;
+using KssSmaPlaLib.IO.File;
+using KssSmaPlaLib.Tools.FileHack;
+using System.Linq;
+
+namespace ExcelToCsvToDb
+{
+ internal class Program
+ {
+ ///
+ /// エンドポイント
+ ///
+ ///
+ /// 0:正常終了、-1以下:異常終了
+ static int Main(string[] args)
+ {
+ // 暗号化ツール(Additional)
+ if (SimpleEncryptUxer.TuckIntoMain(args)) return 0;
+ if (FIleEncryptUxer.TuckIntoMain(args)) return 0;
+ if (SplitFileBySizeUxer.TuckIntoMain(args)) return 0;
+ if (MergeSplitFilesUxer.TuckIntoMain(args)) return 0;
+
+ // INIファイルパス
+ if (!PathUxer.TryResolveInAssemblyFolder(Common.INI_FILE_NAME, out Common.INI_FILE_PATH))
+ {
+ LoggerUxer.Error($"設定INIファイルのパス解決に失敗しました。[ファイル名:{Common.INI_FILE_NAME}]");
+ return (int)Common.RetCode.IniFiilePathError;
+ }
+
+ // ログINI初期化(無ければ)と起動ログ
+ LoggerUxer.Initialize(Common.INI_FILE_PATH);
+ LoggerUxer.StartInfo();
+
+ LoggerUxer.Info($"[起動時引数:{string.Join(",", args)}]");
+
+ if (args.Length < 1)
+ {
+ LoggerUxer.Error("起動時引数が1個以上必要です。");
+ return (int)Common.RetCode.ExecuteParameterCountError;
+ }
+
+ // タスク起動判定
+ var isTask = false;
+ string[] argsNew = args;
+ if (args[0].Trim().ToLower() == "/task")
+ {
+ isTask = true;
+
+ LoggerUxer.Info($"タスクモードで起動されました。[指定:{args[0].Trim()}]");
+
+ // 先頭をカットして従来通り処理させる
+ argsNew = args.Skip(1).ToArray();
+ }
+
+ // 起動パラメータの取得
+ VariableUxer.SetArgs(argsNew);
+
+ // CLの機能ディスパッチャ
+ var stepDispatcher = new StepDispatcherUxer();
+
+ // タスクモード繰り返しループ
+ while (true)
+ {
+ // 処理区分による分岐
+ var shoriKubun = argsNew[0].Trim('/');
+ LoggerUxer.Info($"[処理区分:{shoriKubun}]");
+
+ // ステップリスト取得
+ var dic = IniReaderUxer.ReadSection(Common.INI_FILE_PATH, shoriKubun);
+ if (!StepInfoUxer.TryCreateStepInfoFromIniDic(dic, out var stepInfo, out var messageForMe))
+ {
+ LoggerUxer.Error($"{messageForMe}");
+ return (int)Common.RetCode.StepListError;
+ }
+
+ // ステップ処理開始ログ
+ StepLogUxer.StepInfoLog(stepInfo);
+
+ // ステップ全件
+ foreach (var step in stepInfo.StepList)
+ {
+ IFuncResultDto result;
+
+ LoggerUxer.Info($"ステップを開始します。[ステップ番号:{step.StepNo},機能:{step.StepSignature}]");
+
+ if (!StringUxer.TryParseIniSignature(step.StepSignature, out var functionName, out var funcArgs) || funcArgs.Count < 1)
+ {
+ LoggerUxer.Error($"ステップ情報の形式が不正です。[処理区分:{stepInfo.Title},ステップ番号:{step.StepNo},値(機能名):{step.StepSignature}]");
+ return (int)Common.RetCode.IniStepInfoFormatError;
+ }
+
+ // INIの対象セクション名
+ var iniSectionName = funcArgs[0];
+
+ // 処理振り分け
+ if (functionName.ToUpper() == Common.MAINPJ_KOYU_STEP_NAME_EXCEL_TO_CSV_WEORDER)
+ {
+ // 固有(メインPJ):Excel→CSV(WE生産計画詳細)
+ result = new ExcelToCsv().TryFuncExcelToCsvWeOrderByIni(Common.INI_FILE_PATH, iniSectionName);
+ if (result.Succeeded == false)
+ {
+ LoggerUxer.Error($"ステップが失敗しました。処理を中断します。[エラー内容:{result.ResultMessage}]");
+ return result.ExitCode;
+ }
+ }
+ else if (functionName.ToUpper() == Common.MAINPJ_KOYU_STEP_NAME_EXCEL_TO_CSV_EAZY)
+ {
+ // 固有(メインPJ):Excel→CSV(簡易)
+ result = new ExcelToCsv().TryFuncExcelToCsvEazyByIni(Common.INI_FILE_PATH, iniSectionName);
+ if (result.Succeeded == false)
+ {
+ LoggerUxer.Error($"ステップが失敗しました。処理を中断します。[エラー内容:{result.ResultMessage}]");
+ return result.ExitCode;
+ }
+ }
+ else
+ {
+ // 共通(CL)処理
+ if (!stepDispatcher.TryDispatch(functionName, Common.INI_FILE_PATH, iniSectionName, out messageForMe, out var funcResultDto))
+ {
+ LoggerUxer.Error($"ステップの実行に失敗しました。[処理区分:{shoriKubun},ステップ:{step.StepNo},機能名:{step.StepSignature},エラー内容:{messageForMe}]");
+ return
+ funcResultDto != null && funcResultDto.ExitCode != (int)RetCodeUxer.RetCode.Success ?
+ funcResultDto.ExitCode :
+ (int)Common.RetCode.StepFunctionError;
+ }
+ }
+ LoggerUxer.Info($"ステップが終了しました。[ステップ番号:{step.StepNo},機能:{step.StepSignature}]");
+ }
+ if (!isTask)
+ {
+ LoggerUxer.Info($"全てのステップが終了しました。プログラムを終了します。");
+ return (int)Common.RetCode.Success;
+ }
+ LoggerUxer.Info($"全てのステップが終了しました。少し休憩してのち、再開いたします。");
+
+ // インターバル
+ var sleepSec = int.TryParse(IniHelper.ReadValue(Common.INI_FILE_PATH, "Task", "IntervalSec", "10"), out var intVal) ? intVal : 10;
+ System.Threading.Thread.Sleep(sleepSec * 1000);
+ }
+ }
+ }
+}
diff --git a/src/ExcelToCsvToDb/Properties/AssemblyInfo.cs b/src/ExcelToCsvToDb/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9035dfd
--- /dev/null
+++ b/src/ExcelToCsvToDb/Properties/AssemblyInfo.cs
@@ -0,0 +1,46 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// アセンブリに関する一般的な情報は、次の方法で制御されます。
+// 制御されます。アセンブリに関連付けられている情報を変更するには、
+// これらの属性値を変更します。
+[assembly: AssemblyTitle("ExcelToCsvToDb")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("本田技研工業株式会社")]
+[assembly: AssemblyProduct("ExcelToCsvToDb")]
+[assembly: AssemblyCopyright("Copyright © 本田技研工業株式会社 2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
+// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
+// その型の ComVisible 属性を true に設定します。
+[assembly: ComVisible(false)]
+
+// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります
+[assembly: Guid("6e9d8e26-7349-4fb9-bacf-8b1dc498e08b")]
+
+// アセンブリのバージョン情報は次の 4 つの値で構成されています:
+//
+// メジャー バージョン
+// マイナー バージョン
+// ビルド番号
+// リビジョン
+//
+[assembly: AssemblyVersion("0.9.5.0")]
+[assembly: AssemblyFileVersion("0.9.5.0")]
+// りれき💛
+// 0.8.1.0 INIファイルパスをEXEパスにする
+// 0.8.2.0 基本部番に元々スペースが入っているときの改修
+// 0.9.0.0 新共通書式対応
+// 0.9.1.0 新共通:ファイルパターン一致中最新のみ対象にする機能追加
+// 0.9.2.0 新共通:部番の末尾スペースは不要
+// 0.9.3.0 新共通:DBの挿入前削除で対象データの再過去日から削除するよう修正(修正はCLのほうだけかも)
+// 0.9.4.0 新共通:・別シート部番検索でマッチング方式変更
+// ・パターンに複数ファイル該当時の事前DB削除処理の改善
+// ・タスク起動機能の追加
+// 0.9.5.0 新共通:DBつかんでる対策
+// ・トランザクションを外す
+// ・バルクインサート対応!
diff --git a/src/ExcelToCsvToDb/SQL/DeleteBeforeInsertEazy.sql.txt b/src/ExcelToCsvToDb/SQL/DeleteBeforeInsertEazy.sql.txt
new file mode 100644
index 0000000..62f20a7
--- /dev/null
+++ b/src/ExcelToCsvToDb/SQL/DeleteBeforeInsertEazy.sql.txt
@@ -0,0 +1,6 @@
+DELETE
+FROM
+ vap.t_harahara
+WHERE
+ seisan_date >= :[D]START_DATE
+;
diff --git a/src/ExcelToCsvToDb/SQL/DeleteBeforeInsertWeOrder.sql.txt b/src/ExcelToCsvToDb/SQL/DeleteBeforeInsertWeOrder.sql.txt
new file mode 100644
index 0000000..b7e11ba
--- /dev/null
+++ b/src/ExcelToCsvToDb/SQL/DeleteBeforeInsertWeOrder.sql.txt
@@ -0,0 +1,7 @@
+DELETE
+FROM
+ vap.t_weorder
+WHERE
+ line_id >= :[I]LINE_ID
+ AND plan_date >= :[D]START_DATE
+;
diff --git a/src/ExcelToCsvToDb/SQL/DupCheckTactManagement.sql.txt b/src/ExcelToCsvToDb/SQL/DupCheckTactManagement.sql.txt
new file mode 100644
index 0000000..4e5ca01
--- /dev/null
+++ b/src/ExcelToCsvToDb/SQL/DupCheckTactManagement.sql.txt
@@ -0,0 +1,18 @@
+--select
+-- 0
+--union all
+--select
+-- 2
+--;
+
+SELECT
+ COUNT(*) AS CNT
+FROM
+ vap.t_tact_management
+WHERE
+ --line_id = :[I]line_id AND
+ --model_cd = :[S]model_cd AND
+ basic_parts_no = :[S]basic_parts_no --AND
+ --derivation = :[S]derivation AND
+ --tact = :[I]tact
+;
diff --git a/src/ExcelToCsvToDb/SQL/InsertEazy.sql.txt b/src/ExcelToCsvToDb/SQL/InsertEazy.sql.txt
new file mode 100644
index 0000000..b939b7b
--- /dev/null
+++ b/src/ExcelToCsvToDb/SQL/InsertEazy.sql.txt
@@ -0,0 +1,31 @@
+INSERT
+INTO vap.t_harahara(
+ plan_cd
+ , moto
+ , saki
+ , model_cd
+ , seppen_buban
+ , target_color
+ , kako_color
+ , biko
+ , buhin_mei
+ , kotei_cd
+ , seisan_date
+ , daisu
+ , sp_buban
+)
+VALUES (
+ :[S]PlanCd
+ ,:[S]HaraiMoto
+ ,:[S]HaraiSaki
+ ,:[S]ModelCd
+ ,:[S]SeppenBuban
+ ,:[S]TargetColor
+ ,:[S]KakoColor
+ ,:[S]Biko
+ ,:[S]Buhinmei
+ ,:[I]KoteiCd
+ ,:[D]SeisanHiduke
+ ,:[I]Daisu
+ ,:[S]SpBuban
+)
diff --git a/src/ExcelToCsvToDb/SQL/InsertTactManagement.sql.txt b/src/ExcelToCsvToDb/SQL/InsertTactManagement.sql.txt
new file mode 100644
index 0000000..210cfaf
--- /dev/null
+++ b/src/ExcelToCsvToDb/SQL/InsertTactManagement.sql.txt
@@ -0,0 +1,37 @@
+INSERT
+INTO
+ vap.t_tact_management
+(
+ tact_id,
+ line_id,
+ model_cd,
+ basic_parts_no,
+ derivation,
+ tact
+)
+SELECT
+ CASE
+ WHEN Q1.tact_id IS NULL THEN 'TA' || :[S]basic_parts_no || '0001'
+ ELSE 'TA' || :[S]basic_parts_no || Q1.tact_id
+ END AS tact_id,
+ :[I]line_id AS line_id,
+ :[S]model_cd AS model_cd,
+ :[S]basic_parts_no AS basic_parts_no,
+ :[S]derivation AS derivation,
+ :[I]tact AS tact
+FROM
+ (
+ SELECT
+ LPAD((MAX(SUBSTRING(tact_id FROM '.{4}$')::INTEGER) + 1)::TEXT, 4, '0') AS tact_id
+ FROM
+ vap.t_tact_management
+ WHERE
+ LENGTH(tact_id) > 4 AND
+ tact_id ~ '\d{4}$' AND -- 末尾4桁が数字
+ LEFT(tact_id, LENGTH(tact_id) - 4) = 'TA' || :[S]basic_parts_no
+ ) Q1
+--INNER JOIN
+-- md.m_line L
+--ON
+-- L.line_name=:line_name
+;
diff --git a/src/ExcelToCsvToDb/SQL/InsertWeOrder.sql.txt b/src/ExcelToCsvToDb/SQL/InsertWeOrder.sql.txt
new file mode 100644
index 0000000..8079472
--- /dev/null
+++ b/src/ExcelToCsvToDb/SQL/InsertWeOrder.sql.txt
@@ -0,0 +1,32 @@
+INSERT
+INTO
+ vap.t_weorder
+(
+ --we_production_id,
+ --tact_id,
+ --we_product_date,
+ create_record_date,
+ line_id,
+ basic_parts_no,
+ plan_date,
+ af_amount,
+ we_amount,
+ production_lur,
+ model_cd,
+ derivation,
+ tact_time
+)
+VALUES
+(
+ :[D]create_record_date,
+ :[I]line_id,
+ :[S]basic_parts_no,
+ :[D]work_date,
+ :[I]we_amount,
+ 0,
+ :[I]production_lur,
+ :[S]model_cd,
+ :[S]derivation,
+ :[I]tact_time
+)
+;
diff --git a/src/ExcelToCsvToDb/SQL/InsertWeOrderBulk.sql.txt b/src/ExcelToCsvToDb/SQL/InsertWeOrderBulk.sql.txt
new file mode 100644
index 0000000..645e468
--- /dev/null
+++ b/src/ExcelToCsvToDb/SQL/InsertWeOrderBulk.sql.txt
@@ -0,0 +1,48 @@
+-- 一時テーブルはCSVの全カラムを持つテーブルで、コミットしたら消される
+DROP TABLE IF EXISTS work_csv;
+CREATE TEMP TABLE work_csv (
+ create_record_date timestamp without time zone,
+ line_id integer,
+ line_name text,
+ basic_parts_no text,
+ work_date date,
+ af_amount integer,
+ we_amount integer,
+ kd_we_amount integer,
+ production_lur integer,
+ model_cd text,
+ derivation text,
+ tact_time integer
+);
+-- ON COMMIT DROP;
+-- SPLIT --
+COPY work_csv FROM STDIN WITH (FORMAT CSV, HEADER);
+-- SPLIT --
+INSERT
+INTO
+ vap.t_weorder
+ (
+ create_record_date,
+ line_id,
+ basic_parts_no,
+ plan_date,
+ af_amount,
+ we_amount,
+ production_lur,
+ model_cd,
+ derivation,
+ tact_time
+ )
+ SELECT
+ create_record_date,
+ line_id,
+ basic_parts_no,
+ work_date,
+ af_amount,
+ we_amount + kd_we_amount,
+ production_lur,
+ model_cd,
+ derivation,
+ tact_time
+ FROM
+ work_csv;
diff --git a/src/ExcelToCsvToDb/packages.config b/src/ExcelToCsvToDb/packages.config
new file mode 100644
index 0000000..31e6536
--- /dev/null
+++ b/src/ExcelToCsvToDb/packages.config
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDb/setting.ini b/src/ExcelToCsvToDb/setting.ini
new file mode 100644
index 0000000..0c000ff
--- /dev/null
+++ b/src/ExcelToCsvToDb/setting.ini
@@ -0,0 +1,390 @@
+[ExcelToSqlChuzo]
+Title=ExcelSQL ivю捞pj
+001=ExcelToCsv_Eazy(ExcelToSqlChuzoIni)
+[ExcelToCsvPoSp]
+Title=ExcelCSV iPOhSPv捞j
+001=ExcelToCsv_Eazy(ExcelToCsvPoSpIni)
+;002=CsvToDb(CsvToDbEazyIni)
+;002=SFTPUpload(SFTPUploadIni)
+;003=Cleanup(CleanupAfterUploadIni)
+[ExcelToCsvWeOrderMc]
+Title=ExcelCSV inډHf[^Agc[FSj
+001=ExcelToCsv_WeOrder(ExcelToCsvIniMc)
+002=SFTPUpload(SFTPUploadIni)
+003=Cleanup(CleanupAfterUploadIni)
+[ExcelToCsvWeOrderAlumi]
+Title=ExcelCSV inډHf[^Agc[FA~j
+001=ExcelToCsv_WeOrder(ExcelToCsvAlumiIni)
+002=SFTPUpload(SFTPUploadIni)
+003=Cleanup(CleanupAfterUploadIni)
+[ExcelToCsvWeOrderNew001]
+Title=ExcelCSV inډHf[^Agc[FVn1Cj
+001=ExcelToCsv_WeOrder(ExcelToCsvWeNew001Ini)
+002=SFTPUpload(SFTPUploadIni)
+003=Cleanup(CleanupAfterUploadIni)
+[ExcelToCsvWeOrderNewFormat]
+Title=ExcelCSV inډHf[^Agc[FExcelVʏj
+001=ExcelToCsv_WeOrder(ExcelToCsvWeNewFormatIni)
+;002=SFTPUpload(SFTPUploadIni)
+;003=Cleanup(CleanupAfterUploadIni)
+
+;
+[ExcelToSqlChuzoIni]
+DaysToStartOffset=0
+DaysToEndOffset=30
+InFolderPath=C:\CSV\Chuzo
+
+;FileNamePattern=*.xlsm
+;̂PiHPDCj
+;FileNamePattern=*y**zYǗ* ŐV.xlsm
+;̂Qi㉺j@BHMA1iA~j
+;FileNamePattern=*y**z㉺Hv.xlsx
+;̂RiLPDCj
+;FileNamePattern=*_FMsuperYǗ\_ver*.xlsm
+;̂SiGDCj
+FileNamePattern=**-*dグv.xlsx
+
+
+;ȉExcelɈړI
+;IncludedSheetNames=YǗ
+;ExcludedSheetNames=쐬T,,ݒ?,Net&Loss,ݒ,WeDB,CostDB,Yv?,,AFv,SPv,CKD,SPDB,?,Planning,eC?
+;ExcelSheetCheckItems=C4,M/C|D4,@|E4,ғ
+
+;ExcelLineJudgeCol=B
+;ExcelLineJudgeValue=C
+;ExcelLineKeyCell=C5
+;ExcelLineKeyValuePair=20,1|16,1|14,1|17,1|19,1|7,1
+ExcelFileNamePatternToLine=*.xlsx,1|*y**zYǗ* ŐV.xlsm,2|*y**z㉺Hv.xlsx,3|*_FMsuperYǗ\_ver*.xlsm,4|**-*dグv.xlsx,5
+ExcelSettingFileByLineId=1,.\C`\CP.xlsx|2,.\C`\CQ.xlsx|3,.\C`\CR.xlsx|4,.\C`\CS.xlsx|5,.\C`\CT.xlsx
+
+;ȉExcelɈړI
+;ExcelDateYMGetMode=FromDateCell
+
+;ExcelNenGetsuCellAddress=D2
+
+;ȉExcelɈړI
+;ExcelDateRowMode=Fixed
+;ExcelDateRow=888
+;;ExcelDateRowJudgeValue=t
+;ExcelDateRowStartCol=V
+;ExcelDateRowEndValue=
+
+;ExcelSkipSameMonthSheets=false
+
+;ȉExcelɈړI
+;ExcelHiddenRowHandling=skip
+;ExcelDataStartRowJudgeCol=C
+;ExcelDataStartRowJudgeValues=M/C
+;ExcelDataEndJudgeCol=M
+;ExcelDataEndJudgeValue=,10
+;ExcelMcSeisanFukaEnabled=false
+
+;ExcelMcSeisanFukaJudgeCol=B
+;ExcelMcSeisanFukaJudgeValuePattern=*Y*
+;ExcelAfWeCol=B
+
+;ȉExcelɈړI
+;ExcelRowKindCol=M
+;ExcelRowKindTargets=v,
+
+;ExcelItemNameAndColumnLetterMapping=BasicPartsNo:B|ModelCd:|Derivation:C|TactTime:D
+;Col001=PlanCd:"K*SP**"
+;Col002=HaraiMoto:"PO"
+;Col003=HaraiSaki:B
+;Col004=ModelCd:Substring(C,1,3)
+;Col005=SeppenBuban:D
+;Col006=TargetColor:E
+;Col007=KakoColor:F
+;Col008=Biko:G
+;Col009=Buhinmei:H
+;Col010=KoteiCd:ϊl,AI,1=1521,2=1521,3=1521,4=1521,5=1521,=1513
+;Col011=SeisanHiduke:t
+;Col012=Daisu:
+;Col013=SpBuban:Replace(AN,"-","")
+
+;̂PiHPDCj
+;Col001=ModuleId:W[ID
+;Col002=LineId:CID
+;Col003=ProcessGroup:ϊl,C,14=2,16=3,20=4,17=117,19=119,7=107
+;Col004=PartNo:t@Cϊl,D,PartNo.tsv
+;Col005=ProductionDate:t
+;Col006=PlanQty:(M,v)
+;Col007=ActualQty:(M,)
+
+;ExcelLinesOnSheet=1
+;ExcelShimukeTactRowZure=1
+;ExcelKihonBubanGyosu=2
+;OutputTypeCSViftHgjor FormattedText
+;OutputType=FormattedText
+OutputType=CSV
+FormattedTextFormatFile=PlanQty,@@@NOT_EMPTY@@@,KeikakuFormat.txt|JissekiFormat.txt
+OutFolderPath=C:\Output\Chuzo
+CsvFileName=Chuzo
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+CsvEncoding=UTF-8 With BOM
+[ExcelToCsvPoSpIni]
+DaysToStartOffset=1
+InFolderPath=C:\CSV\PoSp
+FileNamePattern=*.xlsx
+IncludedSheetNames=SPv()
+;ExcludedSheetNames=쐬T,,ݒ?,Net&Loss,ݒ,WeDB,CostDB,Yv?,,AFv,SPv,CKD,SPDB,?,Planning,eC?
+ExcelSheetCheckItems=E2,rov[]|A5,lj|B5,o|C5,@|D5,ݕϕ|E5,TARGETF|F5,HF|G5,l|H5,i|I5,TOTAL
+;ExcelLineJudgeCol=B
+;ExcelLineJudgeValue=C
+ExcelDateYMGetMode=TargetCellDate
+ExcelNenGetsuCellAddress=D2
+ExcelDateRowMode=Fixed
+ExcelDateRow=5
+;ExcelDateRowJudgeValue=t
+ExcelDateRowStartCol=J
+ExcelDateRowEndValue=W
+ExcelSkipSameMonthSheets=false
+ExcelHiddenRowHandling=skip
+ExcelDataStartRowJudgeCol=C
+ExcelDataStartRowJudgeValues=@
+ExcelDataEndJudgeCol=D
+ExcelDataEndJudgeValue=
+ExcelMcSeisanFukaEnabled=false
+;ExcelMcSeisanFukaJudgeCol=B
+;ExcelMcSeisanFukaJudgeValuePattern=*Y*
+ExcelAfWeCol=B
+ExcelItemNameAndColumnLetterMapping=BasicPartsNo:B|ModelCd:|Derivation:C|TactTime:D
+Col001=PlanCd:"K*SP**"
+Col002=HaraiMoto:"PO"
+Col003=HaraiSaki:B
+Col004=ModelCd:Substring(C,1,3)
+Col005=SeppenBuban:D
+Col006=TargetColor:E
+Col007=KakoColor:F
+Col008=Biko:G
+Col009=Buhinmei:H
+Col010=KoteiCd:ϊl,AI,1=1521,2=1521,3=1521,4=1521,5=1521,=1513
+Col011=SeisanHiduke:t
+Col012=Daisu:
+Col013=SpBuban:Replace(AN,"-","")
+ExcelLinesOnSheet=1
+ExcelShimukeTactRowZure=1
+ExcelKihonBubanGyosu=2
+OutFolderPath=C:\CSV\PoSp
+CsvFileName=PoSpPlan
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+CsvEncoding=UTF-8 With BOM
+[ExcelToCsvIniMc]
+DaysToStartOffset=1
+InFolderPath=C:\CSV\nډHv
+;FileNamePattern=*Yv*.xlsx
+FileNamePattern=*V*.xlsx
+NameToIdListForLine=MC,57|}`,58
+ExcelSheetCheckItems=D2[or]D1,C|E2[or]E1,Vtg|D5[or]C5,@R[h[or]R[h|E5,d|F5,^Ng|G5,t
+ExcelLineJudgeCol=D
+ExcelLineJudgeValue=C
+ExcelDateRowMode=Fixed
+ExcelDateRow=5
+ExcelDateRowStartCol=H
+ExcelDateRowEndValue=TOTAL
+;ExcelDateYMGetMode=FromYMCells
+ExcelDateYMGetMode=FromDateCell
+ExcelHiddenRowHandling=skip
+ExcelDataStartRowJudgeCol=D
+ExcelDataStartRowJudgeValues=R[h,@,@R[h,{
+ExcelDataEndJudgeCol=G
+ExcelDataEndJudgeValue=
+ExcelMcSeisanFukaEnabled=true
+ExcelMcSeisanFukaJudgeCol=B
+ExcelMcSeisanFukaJudgeValuePattern=*Y*
+ExcelAfWeCol=G
+;ExcelItemNameAndColumnLetterMapping=BasicPartsNo:D|ModelCd:C|Derivation:E|TactTime:F
+OutFolderPath=C:\CSV\nډHv
+CsvFileName=WeOrder
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+;CsvEncoding=UTF-8 With BOM
+[ExcelToCsvAlumiIni]
+DaysToStartOffset=1
+InFolderPath=C:\CSV\nډHv
+NameToIdListForLine=FWL/NO2,78
+FileNamePattern=*A~*.xlsx
+IncludedSheetNames=FWL
+;IncludedSheetNamesw肳ĂƂł
+;ExcludedSheetNames=SUB,COM
+;IncludedLineNames=FWL/NO2
+;IncludedSheetNamesw肳ĂƂł
+;ExcludedLineNames=SUB,COM
+ExcelSheetCheckItems=A3,YEAR|B3,MONTH|C3,C|G4[or]K4,Yv|A7[or]A8,|G7[or]G8,t|G8[or]G9,
+ExcelLineJudgeCol=C
+ExcelLineJudgeValue=C
+ExcelDateYMGetMode=FromYMCells
+;ExcelDateYMGetMode=FromDateCell
+ExcelDateYearCell=A4
+ExcelDateMonthCell=B4
+ExcelDateRowMode=Judge
+ExcelDateRow=5
+ExcelDateRowJudgeCol=G
+ExcelDateRowJudgeValue=t
+ExcelDateRowStartCol=H
+ExcelDateRowEndValue=
+ExcelHiddenRowHandling=skip
+ExcelDataStartRowJudgeCol=G
+ExcelDataStartRowJudgeValues=
+ExcelDataEndJudgeCol=A
+ExcelDataEndJudgeValue=*TOTAL*
+ExcelMcSeisanFukaEnabled=false
+ExcelMcSeisanFukaJudgeCol=B
+ExcelMcSeisanFukaJudgeValuePattern=*Y*
+ExcelAfWeCol=G
+ExcelItemNameAndColumnLetterMapping=BasicPartsNo:A|ModelCd:A|Derivation:F|TactTime:ZZ
+OutFolderPath=C:\CSV\nډHv
+CsvFileName=WeOrder
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+;CsvEncoding=UTF-8 With BOM
+[ExcelToCsvWeNew001Ini]
+DaysToStartOffset=1
+InFolderPath=C:\CSV\nډHv
+NameToIdListForLine=SC1,101|n1C,102
+FileNamePattern=*n1C*.xlsx
+IncludedLineNames=SC1,n1C
+;ExcludedSheetNames=2025.12@,2025.11@6H
+ExcelSheetCheckItems=D2,C|E2,Vtg|D5,@R[h|E5,d|F5,^Ng|G5,t
+ExcelLineJudgeCol=D
+ExcelLineJudgeValue=C
+ExcelDateYMGetMode=FromDateCell
+ExcelDateRowMode=Judge
+ExcelDateRowJudgeCol=G
+ExcelDateRowJudgeValue=t
+ExcelDateRowStartCol=H
+ExcelDateRowEndValue=TOTAL
+ExcelSkipSameMonthSheets=true
+ExcelHiddenRowHandling=skip
+ExcelDataStartRowJudgeCol=D
+ExcelDataStartRowJudgeValues=@
+ExcelDataEndJudgeCol=B
+ExcelDataEndJudgeValue=*TOTAL䐔*
+ExcelMcSeisanFukaEnabled=true
+ExcelMcSeisanFukaJudgeCol=B
+ExcelMcSeisanFukaJudgeValuePattern=*Y*
+ExcelAfWeCol=G
+ExcelItemNameAndColumnLetterMapping=BasicPartsNo:D|ModelCd:C|Derivation:E|TactTime:F
+OutFolderPath=C:\CSV\nډHv
+CsvFileName=WeOrder001
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+;CsvEncoding=UTF-8 With BOM
+[ExcelToCsvWeNewFormatIni]
+DaysToStartOffset=1
+InFolderPath=C:\CSV\Vʏ
+NameToIdListForLine=MC,101|n1,102|}`,103|50@,104|RF@@@COMMA@@@S/A,105|T/T,106
+FileNamePattern=*.xlsm
+IncludedLineNames=MC,n1,}`,50@,RF@@@COMMA@@@S/A,T/T
+ExcludedSheetNames=쐬T,,ݒ?,Net&Loss,ݒ,WeDB,CostDB,Yv?,,AFv,SPv,CKD,SPDB,?,Planning,eC?
+ExcelSheetCheckItems=B2,C|C2,Vtg|B5,t[|C5,敪|D5,^Ng|E5,t
+ExcelLineJudgeCol=B
+ExcelLineJudgeValue=C
+ExcelDateYMGetMode=FromDateCell
+ExcelDateRowMode=Judge
+ExcelDateRowJudgeCol=E
+ExcelDateRowJudgeValue=t
+ExcelDateRowStartCol=F
+ExcelDateRowEndValue=TOTAL
+ExcelSkipSameMonthSheets=false
+ExcelHiddenRowHandling=skip
+ExcelDataStartRowJudgeCol=B
+ExcelDataStartRowJudgeValues=t[
+ExcelDataEndJudgeCol=B
+ExcelDataEndJudgeValue=*TOTAL䐔*
+ExcelMcSeisanFukaEnabled=true
+ExcelMcSeisanFukaJudgeCol=B
+ExcelMcSeisanFukaJudgeValuePattern=*Y*
+ExcelAfWeCol=E
+ExcelItemNameAndColumnLetterMapping=BasicPartsNo:B|ModelCd:ʃV[g,WeDB,D,B,5|Derivation:C|TactTime:D
+ExcelLinesOnSheet=1
+ExcelShimukeTactRowZure=1
+ExcelKihonBubanGyosu=2
+OutFolderPath=C:\CSV\Vʏ
+CsvFileName=WeOrderNewFormat
+FileDtPrefix=yyyyMMdd-HHmmss_
+FileDtSuffix=_yyyyMMdd_HHmmss
+;CsvEncoding=UTF-8 With BOM
+[SFTPUploadIni]
+Host={[SFTP]Host}
+Port={[SFTP]Port}
+UserName={[SFTP]UserName}
+PrivateKeyFilePath={[SFTP]PrivateKeyFilePath}
+PassPhrase={[SFTP]PassPhrase}
+RemotePath={[SFTP]RemotePath}
+InFolderPath=C:\CSV\Vʏ
+FileNamePatterns={[CSV]FileNamePatterns}
+[CleanupAfterUploadIni]
+FolderPath=C:\CSV\DL
+MaxDays=90
+MaxFileCount=100
+[CsvToDbWeOrder]
+Title=CSVDB
+;001=SFTPDownload(SFTPDownloadIni)
+002=CsvToDb(CsvToDbIni)
+;003=SFTPDelete(SFTPDeleteIni)
+;004=Backup(BackupIni)
+[SFTPDownloadIni]
+Host={[SFTP]Host}
+Port={[SFTP]Port}
+UserName={[SFTP]UserName}
+PrivateKeyFilePath={[SFTP]PrivateKeyFilePath}
+PassPhrase={[SFTP]PassPhrase}
+RemotePath={[SFTP]RemotePath}
+OutFolderPath=C:\CSV\DL
+FileNamePatterns={[CSV]FileNamePatterns}
+[CsvToDbIni]
+SqlFolderPath=SQL
+DaysToStartOffset=1
+CsvFileNamePatterns={[CSV]FileNamePatterns}
+CsvFolderPath=C:\CSV\DL
+;CsvEncoding=UTF-8 With BOM
+DbProviderName=|XO
+DbConnectionString=Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=sfsadmin
+DeleteBeforeInsertSqlFiles=DeleteBeforeInsertWeOrder
+InsertProcessingMode=Bulk
+InsertSqlFiles=InsertWeOrder
+DupCheckSqlFiles=
+SqlNameInsertBulk=InsertWeOrderBulk
+[CsvToDbEazyIni]
+SqlFolderPath=SQL
+DaysToStartOffset=1
+CsvFileNamePatterns=*.csv
+CsvFolderPath=C:\CSV\PoSp
+;CsvEncoding=UTF-8 With BOM
+DbProviderName=|XO
+DbConnectionString=Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=sfsadmin
+DeleteBeforeInsertSqlFiles=DeleteBeforeInsertEazy
+InsertSqlFiles=InsertEazy
+DupCheckSqlFiles=
+[SFTPDeleteIni]
+Host={[SFTP]Host}
+Port={[SFTP]Port}
+UserName={[SFTP]UserName}
+PrivateKeyFilePath={[SFTP]PrivateKeyFilePath}
+PassPhrase={[SFTP]PassPhrase}
+RemotePath={[SFTP]RemotePath}
+FileNamePatterns={[CSV]FileNamePatterns}
+[BackupIni]
+SourceFolderPath=C:\CSV\DL
+DestinationFolderPath=C:\CSV\DL\Backup001
+FileNamePatterns={[CSV]FileNamePatterns}
+MaxDays=30
+MaxFileCount=30
+PrefixDtFormat=yyyy-MM-dd-HH-mm-ss_
+SuffixDtFormat=_yyyyMMddHHmmss
+[Logging]
+LogLevel=Information
+LogFilePath=Log\ExcelToCsvToDbLog.log
+RollingInterval=Month
+[SFTP]
+Host=172.23.231.166
+Port=22
+UserName=noboru
+PrivateKeyFilePath=C:\Users\jpa01378\id_rsa_dotnet
+PassPhrase=uI14MRtLpR7iLxWvaTGFfw==
+RemotePath=bbb
+[CSV]
+FileNamePatterns=*WeOrder*.csv
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Class/ColumnDefinition.cs b/src/ExcelToCsvToDbCommon/Class/ColumnDefinition.cs
new file mode 100644
index 0000000..446ddfc
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Class/ColumnDefinition.cs
@@ -0,0 +1,269 @@
+using KssSmaPlaLib.Ini;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
+using System.Drawing.Design;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ExcelToCsvToDbCommon.Class
+{
+ public enum ColumnType
+ {
+ Fixed,
+ Mapping,
+ Conversion,
+ HorizontalDate,
+ ValueAmount,
+ FuncReplace,
+ FuncSubstring,
+ LineId,
+ FileConversion,
+ ModuleId,
+ }
+
+ [TypeConverter(typeof(ExpandableObjectConverter))] // これで [+] で展開可能に!
+ [Editor(typeof(ColumnDefinitionEditor), typeof(UITypeEditor))]
+ public class ColumnDefinition
+ {
+ [ReadOnly(true), DisplayName("論理名")]
+ public string LogicalName { get; set; } = string.Empty; // PlanCd, KoteiCdなど
+ [ReadOnly(true), DisplayName("タイプ")]
+ public ColumnType Type { get; set; } // 処理タイプ
+
+ public string TypeName
+ {
+ get
+ {
+ return GetTypeName(this.Type);
+ }
+ }
+
+ [ReadOnly(true), DisplayName("列(A-Z)")]
+ public string TargetCol { get; set; } = string.Empty; // B, C, ANなどの列レター
+ [ReadOnly(true), DisplayName("固定値/条件")]
+ public string FixedValue { get; set; } = string.Empty; // 固定値 or 変換条件など
+
+ [ReadOnly(true), DisplayName("変換表")]
+ public Dictionary ConvertMap { get; set; } // 変換テーブル
+
+ public string Comment { get; set; } = string.Empty;
+ public string Naiyo
+ {
+ get
+ {
+ switch(this.Type)
+ {
+ case ColumnType.Fixed:
+ return $"固定値 \"{this.FixedValue}\" を出力します。";
+ case ColumnType.Mapping:
+ return $"列 [{this.TargetCol}] の値を出力します。";
+ case ColumnType.Conversion:
+ var henkanhyo = string.Join(",", this.ConvertMap.Select(m => m.Key + ":" + m.Value).ToList());
+ return $"列 [{this.TargetCol}] の値を変換して出力します。({henkanhyo})";
+ case ColumnType.FuncReplace:
+ return $"列 [{this.TargetCol}] の値を部分置換して出力します。({this.FixedValue})";
+ case ColumnType.FuncSubstring:
+ return $"列 [{this.TargetCol}] の値を部分切り取りして出力します。({this.FixedValue.Split(',')[0]}桁目から{this.FixedValue.Split(',')[1]}桁)";
+ case ColumnType.HorizontalDate:
+ return $"横並びのカレンダ日付を出力します。";
+ case ColumnType.ValueAmount:
+ return $"その日の払出し数を出力します。";
+ default:
+ return $"(未登録)";
+ }
+ }
+ }
+
+ public string IniRaw()
+ {
+ var raw = this.LogicalName + ":";
+ switch (this.Type)
+ {
+ case ColumnType.Fixed:
+ raw += $"\"{this.FixedValue}\"";
+ break;
+ case ColumnType.Mapping:
+ raw += this.TargetCol;
+ break;
+ case ColumnType.Conversion:
+ var kvpCsv = string.Join(",", this.ConvertMap.Select(m => m.Key + "=" + m.Value).ToList());
+ raw += "変換値," + this.TargetCol + "," + kvpCsv;
+ break;
+ case ColumnType.HorizontalDate:
+ raw += "横日付";
+ break;
+ case ColumnType.ValueAmount:
+ raw += "数";
+ break;
+ case ColumnType.FuncReplace:
+ raw += "Replace(" + this.TargetCol + "," + this.FixedValue.Replace("→",",") + ")";
+ break;
+ case ColumnType.FuncSubstring:
+ raw += "Substring(" + this.TargetCol + "," + this.FixedValue + ")";
+ break;
+ }
+ return raw;
+ }
+
+ // PropertyGrid上に「何の設定か」を一言で表示する
+ public override string ToString() => $"{LogicalName} ({Type})";
+
+ public static string GetCsvHeader(List cdList)
+ {
+ // ガード句:リストが空なら空文字を返す
+ if (cdList == null || cdList.Count == 0) return string.Empty;
+
+ // LogicalNameをカンマで連結して一行のヘッダー文字列を作成
+ return string.Join(",", cdList.Select(c => c.LogicalName));
+ }
+
+ public static List Load(string iniPath, string sectionName)
+ {
+ var cdList = new List();
+ for (int cnt = 1; cnt < 1000; cnt++)
+ {
+ var rawValue = IniHelper.ReadValue(iniPath, sectionName, $"Col{cnt:d3}", string.Empty);
+ if (string.IsNullOrEmpty(rawValue)) break;
+ cdList.Add(Parse(rawValue, out var messageForMe));
+ }
+ var comments = IniHelper.ReadValue(iniPath, sectionName, "ColComments", string.Empty);
+ if (!string.IsNullOrEmpty(comments))
+ {
+ var ary = comments.Split(',');
+ for (var cnt = 0; cnt < Math.Min(cdList.Count, ary.Length); cnt++)
+ {
+ cdList[cnt].Comment = ary[cnt].Replace("@@@COMMA@@@", ",");
+ }
+ }
+ return cdList;
+ }
+
+ ///
+ /// INI記載値のバリデとnew
+ ///
+ ///
+ ///
+ ///
+ public static ColumnDefinition Parse(string rawValue,out string resultMessage)
+ {
+ resultMessage = string.Empty;
+ try
+ {
+ // 例: Col001=PlanCd:"K*SP**" -> LogicalName="PlanCd", body="\"K*SP**\""
+ var parts = rawValue.Split(new[] { ':' }, 2);
+ var def = new ColumnDefinition { LogicalName = parts[0] };
+ string body = parts[1];
+
+ // 1. 固定値判定 (ダブルクォーテーションで囲まれている)
+ if (body.StartsWith("\"") && body.EndsWith("\""))
+ {
+ def.Type = ColumnType.Fixed;
+ def.FixedValue = body.Trim('\"');
+ }
+ // 1.5. ラインID
+ else if (body == "ラインID")
+ {
+ def.Type = ColumnType.LineId;
+ }
+ // 1.6. モジュールID
+ else if (body == "モジュールID")
+ {
+ def.Type = ColumnType.ModuleId;
+ }
+ // 2. 関数判定 (Replaceなどが含まれる)
+ else if (body.Contains("Replace("))
+ {
+ def.Type = ColumnType.FuncReplace;
+ // 後で正規表現などでANや"-"を引っこ抜く
+ var ary = (body.Replace("Replace(", "").Trim(')').Trim() + ",,").Split(',');
+ def.TargetCol = ary[0].Trim();
+ def.FixedValue = ary[1].Trim() + "→" + ary[2].Trim();
+ }
+ else if (body.Contains("Substring("))
+ {
+ def.Type = ColumnType.FuncSubstring;
+ // 後で正規表現などでANや"-"を引っこ抜く
+ var ary = (body.Replace("Substring(", "").Trim(')').Trim() + ",,").Split(',');
+ def.TargetCol = ary[0].Trim();
+ def.FixedValue = ary[1].Trim() + "," + ary[2].Trim();
+ }
+ // 3. 変換値判定 (カンマ区切りで"変換値"とある)
+ else if (body.StartsWith("変換値"))
+ {
+ def.Type = ColumnType.Conversion;
+ var csv = body.Split(',');
+ def.TargetCol = csv[1]; // B列など
+ def.ConvertMap = csv.Skip(2).Select(s => s.Split('=')).ToDictionary(a => a[0], a => a[1]);
+ }
+ // 3.1 ファイル変換値判定 (カンマ区切りで"ファイル変換値"とある)
+ else if (body.StartsWith("ファイル変換値"))
+ {
+ def.Type = ColumnType.FileConversion;
+ var csv = body.Split(',');
+ def.TargetCol = csv[1]; // B列など
+ var path = csv[2];
+ if (path.IndexOf("\\") < 0) path = ".\\" + path;
+ var dic = new Dictionary();
+ if (!string.IsNullOrEmpty(path) && File.Exists(path))
+ {
+ using (var sr = new StreamReader(path))
+ {
+ var all = sr.ReadToEnd();
+ var lines = all.Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
+ foreach (var line in lines)
+ {
+ if (string.IsNullOrEmpty(line)) continue;
+ var items = line.Split('\t');
+ dic.Add(items[0], items[1]);
+ }
+ }
+ }
+ def.ConvertMap = dic;
+ }
+ // 4. 特殊主役判定 (横日付・数)
+ else if (body == "横日付") def.Type = ColumnType.HorizontalDate;
+ else if (body == "数") def.Type = ColumnType.ValueAmount;
+ // 4.1 特殊主役判定 (数(...))
+ else if (body.StartsWith("数("))
+ {
+ def.Type = ColumnType.ValueAmount;
+ var csv = body.Substring(2).TrimEnd(')').Split(',');
+ def.TargetCol = csv[0].Trim();
+ def.FixedValue = csv[1].Trim();
+ }
+ // 5. 単純マッピング
+ else
+ {
+ def.Type = ColumnType.Mapping;
+ def.TargetCol = body; // D列など
+ }
+ return def;
+ }
+ catch (Exception ex)
+ {
+ resultMessage = ex.Message;
+ return null;
+ }
+ }
+ public static string GetTypeName(ColumnType type)
+ {
+ switch (type)
+ {
+ case ColumnType.Fixed: return "固定値";
+ case ColumnType.Mapping: return "セル値";
+ case ColumnType.Conversion: return "変換値";
+ case ColumnType.FuncReplace: return "置換値";
+ case ColumnType.FuncSubstring: return "部分切り取り値";
+ case ColumnType.HorizontalDate: return "横日付";
+ case ColumnType.ValueAmount: return "数";
+ case ColumnType.LineId: return "ラインID";
+ case ColumnType.ModuleId: return "モジュールID";
+ default: return "(設定なし)";
+ }
+ }
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/Class/ColumnDefinitionEditor.cs b/src/ExcelToCsvToDbCommon/Class/ColumnDefinitionEditor.cs
new file mode 100644
index 0000000..4295ebd
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Class/ColumnDefinitionEditor.cs
@@ -0,0 +1,153 @@
+using ExcelToCsvToDbCommon.Gamen;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing.Design;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Windows.Forms.Design;
+using System.Xml.Serialization;
+
+namespace ExcelToCsvToDbCommon.Class
+{
+ public class ColumnDefinitionEditor : UITypeEditor
+ {
+ // 編集スタイルを「モーダルダイアログ」に指定
+ public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
+ {
+ return UITypeEditorEditStyle.Modal;
+ }
+
+ // [...]ボタンが押された(またはダブルクリックされた)時の処理
+ public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+ {
+ var svc = provider?.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
+ var org = value as ColumnDefinition;
+ var edited = new ColumnDefinition();
+
+ if (svc != null && org != null)
+ {
+ if (org.Type == ColumnType.Fixed &&
+ string.IsNullOrEmpty(org.FixedValue))
+ {
+ // 新規の場合、タイプを選択する
+ using (var frm = new TypeSelectForm())
+ {
+ if (frm.ShowDialog() == DialogResult.Cancel) return org;
+
+ edited.Type = frm.Type;
+ }
+ }
+ else
+ {
+ edited.Type = org.Type;
+ }
+
+ // まず論理名とテーブルカラム名
+ using (var frm = new NameForm(org.LogicalName))
+ {
+ if (frm.ShowDialog() == DialogResult.Cancel) return org;
+
+ edited.LogicalName = frm.LogicalName;
+ }
+
+ switch (edited.Type)
+ {
+ case ColumnType.Fixed:
+ // ★ここで自作の「編集用フォーム」を呼び出す!
+ // configのコピーを渡して、OKなら反映させるのが安全です
+ using (var frm = new ColFixedForm(org.FixedValue))
+ {
+ if (svc.ShowDialog(frm) == DialogResult.Cancel)
+ {
+ return org;
+ }
+ edited.FixedValue = frm.Koteichi;
+ }
+ break;
+
+ case ColumnType.Mapping:
+ // ★ここで自作の「編集用フォーム」を呼び出す!
+ // configのコピーを渡して、OKなら反映させるのが安全です
+ using (var frm = new ColMappingForm(org.TargetCol))
+ {
+ if (svc.ShowDialog(frm) == DialogResult.Cancel)
+ {
+ return org;
+ }
+ edited.TargetCol = frm.Retsu;
+ }
+ break;
+
+ case ColumnType.Conversion:
+ // 列選択
+ using (var frm = new ColMappingForm(org.TargetCol))
+ {
+ if (svc.ShowDialog(frm) == DialogResult.Cancel)
+ {
+ return org;
+ }
+ edited.TargetCol = frm.Retsu;
+ }
+ // 変換値
+ using (var frm = new ColKeyValueListForm(org.ConvertMap))
+ {
+ if (svc.ShowDialog(frm) == DialogResult.Cancel)
+ {
+ return org;
+ }
+ edited.ConvertMap = frm.keyValuePairs;
+ }
+ break;
+ case ColumnType.HorizontalDate:
+ // 何もしない
+ edited.Type = ColumnType.HorizontalDate;
+ break;
+ case ColumnType.ValueAmount:
+ // 何もしない
+ edited.Type = ColumnType.ValueAmount;
+ break;
+ case ColumnType.FuncReplace:
+ // 列選択
+ using (var frm = new ColMappingForm(org.TargetCol))
+ {
+ if (svc.ShowDialog(frm) == DialogResult.Cancel)
+ {
+ return org;
+ }
+ edited.TargetCol = frm.Retsu;
+ }
+ break;
+
+ case ColumnType.FuncSubstring:
+ // 列選択
+ using (var frm = new ColMappingForm(org.TargetCol))
+ {
+ if (svc.ShowDialog(frm) == DialogResult.Cancel)
+ {
+ return org;
+ }
+ edited.TargetCol = frm.Retsu;
+ }
+
+ //途中でやめた!(笑)🔥🌊
+ //// 置換値
+ //using (var frm = new ColReplaceForm(org.ConvertMap))
+ //{
+ // if (svc.ShowDialog(frm) == DialogResult.Cancel)
+ // {
+ // return org;
+ // }
+ // edited.ConvertMap = frm.keyValuePairs;
+ //}
+ break;
+ }
+ return edited; // 編集後のデータを返す
+ }
+ return org;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Class/IniConfigContainer.cs b/src/ExcelToCsvToDbCommon/Class/IniConfigContainer.cs
new file mode 100644
index 0000000..b291937
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Class/IniConfigContainer.cs
@@ -0,0 +1,19 @@
+using ExcelToCsvToDbCommon.Class;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ReiaSanTool.Class
+{
+ public class IniConfigContainer
+ {
+ // [Category] や [DisplayName] で見た目を整える
+ [Category("設定")]
+ [DisplayName("列定義リスト")]
+ [Description("ここをクリックして右側の [...] ボタンを押すと、項目の追加・移動・削除ができます")]
+ public BindingList Columns { get; set; } = new BindingList();
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/ExcelToCsvToDbCommon.csproj b/src/ExcelToCsvToDbCommon/ExcelToCsvToDbCommon.csproj
new file mode 100644
index 0000000..02c9041
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/ExcelToCsvToDbCommon.csproj
@@ -0,0 +1,115 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}
+ Library
+ Properties
+ ExcelToCsvToDbCommon
+ ExcelToCsvToDbCommon
+ v4.8
+ 512
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ ColFixedForm.cs
+
+
+ Form
+
+
+ ColKeyValueListForm.cs
+
+
+ Form
+
+
+ ColMappingForm.cs
+
+
+ Form
+
+
+ ColReplaceForm.cs
+
+
+ Form
+
+
+ NameForm.cs
+
+
+ Form
+
+
+ TypeSelectForm.cs
+
+
+
+
+
+ ColFixedForm.cs
+
+
+ ColKeyValueListForm.cs
+
+
+ ColMappingForm.cs
+
+
+ ColReplaceForm.cs
+
+
+ NameForm.cs
+
+
+ TypeSelectForm.cs
+
+
+
+
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}
+ KssSmaPlaLib
+
+
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.Designer.cs b/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.Designer.cs
new file mode 100644
index 0000000..19160c1
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.Designer.cs
@@ -0,0 +1,93 @@
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ partial class ColFixedForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.KoteichiText = new System.Windows.Forms.TextBox();
+ this.CancelButton2 = new System.Windows.Forms.Button();
+ this.OkButton = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // KoteichiText
+ //
+ this.KoteichiText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.KoteichiText.Location = new System.Drawing.Point(12, 12);
+ this.KoteichiText.Name = "KoteichiText";
+ this.KoteichiText.Size = new System.Drawing.Size(532, 49);
+ this.KoteichiText.TabIndex = 0;
+ //
+ // CancelButton2
+ //
+ this.CancelButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelButton2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelButton2.Location = new System.Drawing.Point(367, 74);
+ this.CancelButton2.Name = "CancelButton2";
+ this.CancelButton2.Size = new System.Drawing.Size(177, 48);
+ this.CancelButton2.TabIndex = 4;
+ this.CancelButton2.Text = "キャンセル";
+ this.CancelButton2.UseVisualStyleBackColor = true;
+ //
+ // OkButton
+ //
+ this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkButton.Location = new System.Drawing.Point(281, 74);
+ this.OkButton.Name = "OkButton";
+ this.OkButton.Size = new System.Drawing.Size(80, 48);
+ this.OkButton.TabIndex = 3;
+ this.OkButton.Text = "OK";
+ this.OkButton.UseVisualStyleBackColor = true;
+ this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+ //
+ // ColFixedForm
+ //
+ this.AcceptButton = this.OkButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(556, 134);
+ this.Controls.Add(this.CancelButton2);
+ this.Controls.Add(this.OkButton);
+ this.Controls.Add(this.KoteichiText);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "ColFixedForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "固定値";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox KoteichiText;
+ private System.Windows.Forms.Button CancelButton2;
+ private System.Windows.Forms.Button OkButton;
+ }
+}
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.cs b/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.cs
new file mode 100644
index 0000000..b218963
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.cs
@@ -0,0 +1,31 @@
+using ExcelToCsvToDbCommon.Class;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ public partial class ColFixedForm : Form
+ {
+ public string Koteichi { get; set; }
+
+ public ColFixedForm(string fixValue)
+ {
+ InitializeComponent();
+
+ KoteichiText.Text = fixValue;
+ }
+
+ private void OkButton_Click(object sender, EventArgs e)
+ {
+ Koteichi = KoteichiText.Text;
+ DialogResult = DialogResult.OK;
+ }
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.resx b/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColFixedForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.Designer.cs b/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.Designer.cs
new file mode 100644
index 0000000..0b509f8
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.Designer.cs
@@ -0,0 +1,97 @@
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ partial class ColKeyValueListForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.KeyValueListDgv = new System.Windows.Forms.DataGridView();
+ this.CancelButton2 = new System.Windows.Forms.Button();
+ this.OkButton = new System.Windows.Forms.Button();
+ ((System.ComponentModel.ISupportInitialize)(this.KeyValueListDgv)).BeginInit();
+ this.SuspendLayout();
+ //
+ // KeyValueListDgv
+ //
+ this.KeyValueListDgv.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.KeyValueListDgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.KeyValueListDgv.Location = new System.Drawing.Point(12, 12);
+ this.KeyValueListDgv.Name = "KeyValueListDgv";
+ this.KeyValueListDgv.RowHeadersWidth = 62;
+ this.KeyValueListDgv.RowTemplate.Height = 27;
+ this.KeyValueListDgv.Size = new System.Drawing.Size(477, 194);
+ this.KeyValueListDgv.TabIndex = 0;
+ //
+ // CancelButton2
+ //
+ this.CancelButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelButton2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelButton2.Location = new System.Drawing.Point(312, 221);
+ this.CancelButton2.Name = "CancelButton2";
+ this.CancelButton2.Size = new System.Drawing.Size(177, 48);
+ this.CancelButton2.TabIndex = 8;
+ this.CancelButton2.Text = "キャンセル";
+ this.CancelButton2.UseVisualStyleBackColor = true;
+ //
+ // OkButton
+ //
+ this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkButton.Location = new System.Drawing.Point(226, 221);
+ this.OkButton.Name = "OkButton";
+ this.OkButton.Size = new System.Drawing.Size(80, 48);
+ this.OkButton.TabIndex = 7;
+ this.OkButton.Text = "OK";
+ this.OkButton.UseVisualStyleBackColor = true;
+ this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+ //
+ // ColKeyValueListForm
+ //
+ this.AcceptButton = this.OkButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(501, 281);
+ this.Controls.Add(this.CancelButton2);
+ this.Controls.Add(this.OkButton);
+ this.Controls.Add(this.KeyValueListDgv);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "ColKeyValueListForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "変換値";
+ ((System.ComponentModel.ISupportInitialize)(this.KeyValueListDgv)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DataGridView KeyValueListDgv;
+ private System.Windows.Forms.Button CancelButton2;
+ private System.Windows.Forms.Button OkButton;
+ }
+}
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.cs b/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.cs
new file mode 100644
index 0000000..f8ed136
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ public partial class ColKeyValueListForm : Form
+ {
+ public Dictionary keyValuePairs;
+
+ // フォーム側で保持
+ private BindingList _bindingList;
+
+ public ColKeyValueListForm(Dictionary kvpDic)
+ {
+ InitializeComponent();
+
+ if (kvpDic is null) kvpDic = new Dictionary();
+
+ _bindingList = new BindingList(
+ kvpDic.Select(x => new ConfigItem { Key = x.Key, Value = x.Value }).ToList()
+ );
+ // バインド!これだけで画面と連動します
+ KeyValueListDgv.DataSource = _bindingList;
+ }
+
+ private void OkButton_Click(object sender, EventArgs e)
+ {
+ keyValuePairs = _bindingList
+ .Where(x => !string.IsNullOrWhiteSpace(x.Key)) // 空のキーを除外
+ .ToDictionary(x => x.Key, x => x.Value);
+ DialogResult = DialogResult.OK;
+ }
+ }
+
+ // キーと値を持つシンプルなクラスを用意
+ public class ConfigItem
+ {
+ public string Key { get; set; }
+ public string Value { get; set; }
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.resx b/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColKeyValueListForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.Designer.cs b/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.Designer.cs
new file mode 100644
index 0000000..74f0df2
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.Designer.cs
@@ -0,0 +1,95 @@
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ partial class ColMappingForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.RetsuCombo = new System.Windows.Forms.ComboBox();
+ this.CancelButton2 = new System.Windows.Forms.Button();
+ this.OkButton = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // RetsuCombo
+ //
+ this.RetsuCombo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.RetsuCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.RetsuCombo.FormattingEnabled = true;
+ this.RetsuCombo.Location = new System.Drawing.Point(12, 12);
+ this.RetsuCombo.Name = "RetsuCombo";
+ this.RetsuCombo.Size = new System.Drawing.Size(369, 50);
+ this.RetsuCombo.TabIndex = 0;
+ this.RetsuCombo.SelectedIndexChanged += new System.EventHandler(this.RetsuCombo_SelectedIndexChanged);
+ //
+ // CancelButton2
+ //
+ this.CancelButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelButton2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelButton2.Location = new System.Drawing.Point(204, 83);
+ this.CancelButton2.Name = "CancelButton2";
+ this.CancelButton2.Size = new System.Drawing.Size(177, 48);
+ this.CancelButton2.TabIndex = 6;
+ this.CancelButton2.Text = "キャンセル";
+ this.CancelButton2.UseVisualStyleBackColor = true;
+ //
+ // OkButton
+ //
+ this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkButton.Location = new System.Drawing.Point(118, 83);
+ this.OkButton.Name = "OkButton";
+ this.OkButton.Size = new System.Drawing.Size(80, 48);
+ this.OkButton.TabIndex = 5;
+ this.OkButton.Text = "OK";
+ this.OkButton.UseVisualStyleBackColor = true;
+ this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+ //
+ // ColMappingForm
+ //
+ this.AcceptButton = this.OkButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(393, 143);
+ this.Controls.Add(this.CancelButton2);
+ this.Controls.Add(this.OkButton);
+ this.Controls.Add(this.RetsuCombo);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "ColMappingForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "列";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ComboBox RetsuCombo;
+ private System.Windows.Forms.Button CancelButton2;
+ private System.Windows.Forms.Button OkButton;
+ }
+}
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.cs b/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.cs
new file mode 100644
index 0000000..6975e87
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ public partial class ColMappingForm : Form
+ {
+ public string Retsu { get; set; }
+
+ public ColMappingForm(string retsu)
+ {
+ InitializeComponent();
+
+ // 例:AからZZ(702列)まで追加
+ for (int i = 1; i <= 702; i++)
+ {
+ RetsuCombo.Items.Add(GetExcelColumnName(i));
+ }
+ RetsuCombo.Text = retsu; // デフォルトで "A" を選択
+
+ RetsuCombo_SelectedIndexChanged(null, null);
+ }
+
+ // 数値をExcel形式の列名(A, B... AA...)に変換するメソッド
+ private string GetExcelColumnName(int columnNumber)
+ {
+ string columnName = "";
+ while (columnNumber > 0)
+ {
+ int modulo = (columnNumber - 1) % 26;
+ columnName = Convert.ToChar('A' + modulo) + columnName;
+ columnNumber = (columnNumber - modulo) / 26;
+ }
+ return columnName;
+ }
+
+ private void RetsuCombo_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ OkButton.Enabled = RetsuCombo.SelectedIndex != -1;
+ }
+
+ private void OkButton_Click(object sender, EventArgs e)
+ {
+ this.Retsu = RetsuCombo.Text;
+ this.DialogResult = DialogResult.OK;
+ }
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.resx b/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColMappingForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.Designer.cs b/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.Designer.cs
new file mode 100644
index 0000000..cd60760
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.Designer.cs
@@ -0,0 +1,129 @@
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ partial class ColReplaceForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.MaeText = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.AtoText = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.CancelButton2 = new System.Windows.Forms.Button();
+ this.OkButton = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // MaeText
+ //
+ this.MaeText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.MaeText.Location = new System.Drawing.Point(148, 12);
+ this.MaeText.Name = "MaeText";
+ this.MaeText.Size = new System.Drawing.Size(352, 49);
+ this.MaeText.TabIndex = 0;
+ this.MaeText.TextChanged += new System.EventHandler(this.MaeText_TextChanged);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 15);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(130, 42);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "置換前:";
+ //
+ // AtoText
+ //
+ this.AtoText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.AtoText.Location = new System.Drawing.Point(148, 67);
+ this.AtoText.Name = "AtoText";
+ this.AtoText.Size = new System.Drawing.Size(352, 49);
+ this.AtoText.TabIndex = 2;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(12, 70);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(130, 42);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "置換後:";
+ //
+ // CancelButton2
+ //
+ this.CancelButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelButton2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelButton2.Location = new System.Drawing.Point(323, 131);
+ this.CancelButton2.Name = "CancelButton2";
+ this.CancelButton2.Size = new System.Drawing.Size(177, 48);
+ this.CancelButton2.TabIndex = 8;
+ this.CancelButton2.Text = "キャンセル";
+ this.CancelButton2.UseVisualStyleBackColor = true;
+ //
+ // OkButton
+ //
+ this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkButton.Location = new System.Drawing.Point(237, 131);
+ this.OkButton.Name = "OkButton";
+ this.OkButton.Size = new System.Drawing.Size(80, 48);
+ this.OkButton.TabIndex = 7;
+ this.OkButton.Text = "OK";
+ this.OkButton.UseVisualStyleBackColor = true;
+ this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+ //
+ // ColReplaceForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(512, 191);
+ this.Controls.Add(this.CancelButton2);
+ this.Controls.Add(this.OkButton);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.AtoText);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.MaeText);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "ColReplaceForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "置換";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox MaeText;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox AtoText;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button CancelButton2;
+ private System.Windows.Forms.Button OkButton;
+ }
+}
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.cs b/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.cs
new file mode 100644
index 0000000..905816d
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ public partial class ColReplaceForm : Form
+ {
+ public string Mae { get; set; }
+ public string Ato { get; set; }
+
+ public ColReplaceForm(string mae, string ato)
+ {
+ InitializeComponent();
+
+ MaeText.Text = mae;
+ AtoText.Text = ato;
+
+ MaeText_TextChanged(null, null);
+ }
+
+ private void MaeText_TextChanged(object sender, EventArgs e)
+ {
+ OkButton.Enabled = !string.IsNullOrEmpty(MaeText.Text);
+ }
+
+ private void OkButton_Click(object sender, EventArgs e)
+ {
+ Mae = MaeText.Text;
+ Ato = AtoText.Text;
+ DialogResult = DialogResult.OK;
+ }
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.resx b/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/ColReplaceForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/NameForm.Designer.cs b/src/ExcelToCsvToDbCommon/Gamen/NameForm.Designer.cs
new file mode 100644
index 0000000..3b714ee
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/NameForm.Designer.cs
@@ -0,0 +1,130 @@
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ partial class NameForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.LogicalNameText = new System.Windows.Forms.TextBox();
+ this.TableColumnName = new System.Windows.Forms.TextBox();
+ this.CancelButton2 = new System.Windows.Forms.Button();
+ this.OkButton = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(152, 15);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(130, 42);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "論理名:";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(12, 70);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(270, 42);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "テーブルカラム名:";
+ //
+ // LogicalNameText
+ //
+ this.LogicalNameText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.LogicalNameText.Location = new System.Drawing.Point(288, 12);
+ this.LogicalNameText.Name = "LogicalNameText";
+ this.LogicalNameText.Size = new System.Drawing.Size(568, 49);
+ this.LogicalNameText.TabIndex = 2;
+ this.LogicalNameText.TextChanged += new System.EventHandler(this.LogicalNameText_TextChanged);
+ //
+ // TableColumnName
+ //
+ this.TableColumnName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.TableColumnName.Location = new System.Drawing.Point(288, 67);
+ this.TableColumnName.Name = "TableColumnName";
+ this.TableColumnName.Size = new System.Drawing.Size(568, 49);
+ this.TableColumnName.TabIndex = 3;
+ //
+ // CancelButton2
+ //
+ this.CancelButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelButton2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelButton2.Location = new System.Drawing.Point(679, 133);
+ this.CancelButton2.Name = "CancelButton2";
+ this.CancelButton2.Size = new System.Drawing.Size(177, 48);
+ this.CancelButton2.TabIndex = 5;
+ this.CancelButton2.Text = "キャンセル";
+ this.CancelButton2.UseVisualStyleBackColor = true;
+ //
+ // OkButton
+ //
+ this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkButton.Location = new System.Drawing.Point(508, 133);
+ this.OkButton.Name = "OkButton";
+ this.OkButton.Size = new System.Drawing.Size(165, 48);
+ this.OkButton.TabIndex = 4;
+ this.OkButton.Text = "つぎへ👉";
+ this.OkButton.UseVisualStyleBackColor = true;
+ this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+ //
+ // NameForm
+ //
+ this.AcceptButton = this.OkButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(868, 193);
+ this.Controls.Add(this.CancelButton2);
+ this.Controls.Add(this.OkButton);
+ this.Controls.Add(this.TableColumnName);
+ this.Controls.Add(this.LogicalNameText);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "NameForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "論理名とテーブルカラム名";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.TextBox LogicalNameText;
+ private System.Windows.Forms.TextBox TableColumnName;
+ private System.Windows.Forms.Button CancelButton2;
+ private System.Windows.Forms.Button OkButton;
+ }
+}
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/NameForm.cs b/src/ExcelToCsvToDbCommon/Gamen/NameForm.cs
new file mode 100644
index 0000000..3b8e5c9
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/NameForm.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ public partial class NameForm : Form
+ {
+ public string LogicalName { get; set; }
+
+ public NameForm(string logicalName)
+ {
+ InitializeComponent();
+
+ if (logicalName.IndexOf("(") >= 0)
+ {
+ LogicalNameText.Text = logicalName.Split('(')[0].Trim();
+ TableColumnName.Text = logicalName.Split('(')[1].Trim(')').Trim();
+ }
+ else
+ {
+ LogicalNameText.Text = logicalName.Trim();
+ TableColumnName.Text = string.Empty;
+ }
+ LogicalNameText_TextChanged(null, null);
+ }
+
+ private void LogicalNameText_TextChanged(object sender, EventArgs e)
+ {
+ OkButton.Enabled = LogicalNameText.Text != "";
+ }
+
+ private void OkButton_Click(object sender, EventArgs e)
+ {
+ LogicalName = LogicalNameText.Text +
+ (string.IsNullOrEmpty(TableColumnName.Text.Trim()) ? "" : $"({TableColumnName.Text})");
+ DialogResult = DialogResult.OK;
+ }
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/Gamen/NameForm.resx b/src/ExcelToCsvToDbCommon/Gamen/NameForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/NameForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.Designer.cs b/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.Designer.cs
new file mode 100644
index 0000000..fa76cc6
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.Designer.cs
@@ -0,0 +1,94 @@
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ partial class TypeSelectForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.TypeCombo = new System.Windows.Forms.ComboBox();
+ this.OkButton = new System.Windows.Forms.Button();
+ this.CancelButton2 = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // TypeCombo
+ //
+ this.TypeCombo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.TypeCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.TypeCombo.FormattingEnabled = true;
+ this.TypeCombo.Location = new System.Drawing.Point(12, 12);
+ this.TypeCombo.Name = "TypeCombo";
+ this.TypeCombo.Size = new System.Drawing.Size(439, 50);
+ this.TypeCombo.TabIndex = 0;
+ //
+ // OkButton
+ //
+ this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkButton.Location = new System.Drawing.Point(111, 80);
+ this.OkButton.Name = "OkButton";
+ this.OkButton.Size = new System.Drawing.Size(157, 48);
+ this.OkButton.TabIndex = 1;
+ this.OkButton.Text = "つぎへ👉";
+ this.OkButton.UseVisualStyleBackColor = true;
+ this.OkButton.Click += new System.EventHandler(this.OkButton_Click);
+ //
+ // CancelButton2
+ //
+ this.CancelButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelButton2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelButton2.Location = new System.Drawing.Point(274, 80);
+ this.CancelButton2.Name = "CancelButton2";
+ this.CancelButton2.Size = new System.Drawing.Size(177, 48);
+ this.CancelButton2.TabIndex = 2;
+ this.CancelButton2.Text = "キャンセル";
+ this.CancelButton2.UseVisualStyleBackColor = true;
+ //
+ // TypeSelectForm
+ //
+ this.AcceptButton = this.OkButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(463, 140);
+ this.Controls.Add(this.CancelButton2);
+ this.Controls.Add(this.OkButton);
+ this.Controls.Add(this.TypeCombo);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "TypeSelectForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "タイプ選択";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ComboBox TypeCombo;
+ private System.Windows.Forms.Button OkButton;
+ private System.Windows.Forms.Button CancelButton2;
+ }
+}
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.cs b/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.cs
new file mode 100644
index 0000000..90c0b89
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.cs
@@ -0,0 +1,31 @@
+using ExcelToCsvToDbCommon.Class;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ExcelToCsvToDbCommon.Gamen
+{
+ public partial class TypeSelectForm : Form
+ {
+ public ColumnType Type { get; set; }
+
+ public TypeSelectForm()
+ {
+ InitializeComponent();
+
+ TypeCombo.DataSource = Enum.GetValues(typeof(ColumnType));
+ }
+
+ private void OkButton_Click(object sender, EventArgs e)
+ {
+ Type = (ColumnType)TypeCombo.SelectedValue;
+ DialogResult = DialogResult.OK;
+ }
+ }
+}
diff --git a/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.resx b/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Gamen/TypeSelectForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ExcelToCsvToDbCommon/Properties/AssemblyInfo.cs b/src/ExcelToCsvToDbCommon/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0335d6f
--- /dev/null
+++ b/src/ExcelToCsvToDbCommon/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// アセンブリに関する一般情報は以下を通して制御されます
+// 制御されます。アセンブリに関連付けられている情報を変更するには、
+// これらの属性値を変更してください。
+[assembly: AssemblyTitle("ExcelToCsvToDbCommon")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("本田技研工業株式会社")]
+[assembly: AssemblyProduct("ExcelToCsvToDbCommon")]
+[assembly: AssemblyCopyright("Copyright © 本田技研工業株式会社 2026")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
+// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
+// その型の ComVisible 属性を true に設定してください。
+[assembly: ComVisible(false)]
+
+// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります
+[assembly: Guid("9f267a81-8387-46f7-a299-cfc26216f895")]
+
+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
+//
+// メジャー バージョン
+// マイナー バージョン
+// ビルド番号
+// リビジョン
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/ReiaSanTool/App.config b/src/ReiaSanTool/App.config
new file mode 100644
index 0000000..ff226ea
--- /dev/null
+++ b/src/ReiaSanTool/App.config
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/ReiaSanTool/Class/IniAdapter.cs b/src/ReiaSanTool/Class/IniAdapter.cs
new file mode 100644
index 0000000..bec167a
--- /dev/null
+++ b/src/ReiaSanTool/Class/IniAdapter.cs
@@ -0,0 +1,32 @@
+//using System;
+//using System.Collections.Generic;
+//using System.ComponentModel;
+//using System.Linq;
+//using System.Text;
+//using System.Threading.Tasks;
+
+//namespace ReiaSanTool.Class
+//{
+// public class IniAdapter : CustomTypeDescriptor
+// {
+// private Dictionary> _data;
+// private PropertyDescriptorCollection _propCache; // キャッシュ用
+
+// public IniAdapter(Dictionary> data) => _data = data;
+
+// public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+// {
+// // 毎回 new せず、一度作ったリストを使い回すのが PropertyGrid の鉄則です!
+// if (_propCache == null)
+// {
+// var props = _data.SelectMany(sec =>
+// sec.Value.Select(kv => new IniPropertyDescriptor(sec.Key, kv.Key, sec.Value))
+// ).ToArray();
+// _propCache = new PropertyDescriptorCollection(props);
+// }
+// return _propCache;
+// }
+
+// public override PropertyDescriptorCollection GetProperties() => GetProperties(null);
+// }
+//}
diff --git a/src/ReiaSanTool/Class/IniPropertyDescriptor.cs b/src/ReiaSanTool/Class/IniPropertyDescriptor.cs
new file mode 100644
index 0000000..74f8787
--- /dev/null
+++ b/src/ReiaSanTool/Class/IniPropertyDescriptor.cs
@@ -0,0 +1,48 @@
+//using System;
+//using System.Collections.Generic;
+//using System.ComponentModel;
+//using System.Linq;
+//using System.Text;
+//using System.Threading.Tasks;
+
+//namespace ReiaSanTool.Class
+//{
+// public class IniPropertyDescriptor : PropertyDescriptor
+// {
+// private Dictionary _section;
+// private string _key;
+
+// public IniPropertyDescriptor(string sectionName, string key, Dictionary sectionData)
+// : base($"{sectionName}_{key}", new Attribute[] { new CategoryAttribute(sectionName) })
+// {
+// _section = sectionData;
+// _key = key;
+// }
+
+// public override string DisplayName => _key;
+// public override Type ComponentType => typeof(IniAdapter);
+// public override bool IsReadOnly => false;
+// public override Type PropertyType => typeof(string);
+
+// // ★これを追加!型変換で迷わせないための「道しるべ」です
+// public override TypeConverter Converter => new StringConverter(); // 型変換で迷わせない
+
+// public override object GetValue(object component) => _section[_key];
+
+
+// // これらが False や Default だと、確定時に値が捨てられることがあります
+// public override bool CanResetValue(object component) => true;
+// public override void ResetValue(object component) { }
+// public override bool ShouldSerializeValue(object component) => true;
+
+// public override void SetValue(object component, object value)
+// {
+// // 確実に値を代入
+// _section[_key] = value?.ToString() ?? "";
+
+// // 【重要】PropertyGridに「このインスタンスの中身が変わったよ」と公式に通知
+// // これにより、PropertyGridはキャッシュを捨てて表示を更新します。
+// OnValueChanged(component, EventArgs.Empty);
+// }
+// }
+//}
\ No newline at end of file
diff --git a/src/ReiaSanTool/Dto/IniAll.cs b/src/ReiaSanTool/Dto/IniAll.cs
new file mode 100644
index 0000000..f3497d8
--- /dev/null
+++ b/src/ReiaSanTool/Dto/IniAll.cs
@@ -0,0 +1,33 @@
+using KssSmaPlaLib.Ini;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ReiaSanTool.Dto
+{
+ public class IniAll
+ {
+ // これがPropertyGridに表示される項目になります
+ [Category("System")]
+ [DisplayName("ユーザー名")]
+ public string UserName { get; set; } = "Admin";
+
+ // --- ロード ---
+ public void Load()
+ {
+ // [System] セクションの UserName キーを読む
+ this.UserName = IniHelper.ReadValue(null, "System", "UserName", "DefaultUser");
+ }
+
+ // --- セーブ ---
+ public void Save()
+ {
+ // [System] セクションに UserName の値を書き込む
+ IniHelper.WriteValue(null, "System", "UserName", this.UserName);
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Gamen/EditColumnForm.Designer.cs b/src/ReiaSanTool/Gamen/EditColumnForm.Designer.cs
new file mode 100644
index 0000000..577e9ac
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/EditColumnForm.Designer.cs
@@ -0,0 +1,162 @@
+namespace ReiaSanTool.Gamen
+{
+ partial class EditColumnForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.BasePanel = new System.Windows.Forms.Panel();
+ this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+ this.HeaderPanel = new System.Windows.Forms.Panel();
+ this.TypeCombo = new System.Windows.Forms.ComboBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.TypeAPanel = new System.Windows.Forms.Panel();
+ this.label2 = new System.Windows.Forms.Label();
+ this.KoteichiText = new System.Windows.Forms.TextBox();
+ this.BasePanel.SuspendLayout();
+ this.MainTableLayoutPanel.SuspendLayout();
+ this.HeaderPanel.SuspendLayout();
+ this.TypeAPanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // BasePanel
+ //
+ this.BasePanel.AutoScroll = true;
+ this.BasePanel.Controls.Add(this.MainTableLayoutPanel);
+ this.BasePanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.BasePanel.Location = new System.Drawing.Point(0, 0);
+ this.BasePanel.Name = "BasePanel";
+ this.BasePanel.Size = new System.Drawing.Size(549, 267);
+ this.BasePanel.TabIndex = 0;
+ //
+ // MainTableLayoutPanel
+ //
+ this.MainTableLayoutPanel.ColumnCount = 1;
+ this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.MainTableLayoutPanel.Controls.Add(this.HeaderPanel, 0, 0);
+ this.MainTableLayoutPanel.Controls.Add(this.TypeAPanel, 0, 1);
+ this.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Top;
+ this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+ this.MainTableLayoutPanel.Name = "MainTableLayoutPanel";
+ this.MainTableLayoutPanel.RowCount = 2;
+ this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 32.03463F));
+ this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 67.96537F));
+ this.MainTableLayoutPanel.Size = new System.Drawing.Size(549, 231);
+ this.MainTableLayoutPanel.TabIndex = 0;
+ //
+ // HeaderPanel
+ //
+ this.HeaderPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.HeaderPanel.Controls.Add(this.label1);
+ this.HeaderPanel.Controls.Add(this.TypeCombo);
+ this.HeaderPanel.Location = new System.Drawing.Point(3, 3);
+ this.HeaderPanel.Name = "HeaderPanel";
+ this.HeaderPanel.Size = new System.Drawing.Size(543, 68);
+ this.HeaderPanel.TabIndex = 0;
+ //
+ // TypeCombo
+ //
+ this.TypeCombo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.TypeCombo.FormattingEnabled = true;
+ this.TypeCombo.Location = new System.Drawing.Point(145, 9);
+ this.TypeCombo.Name = "TypeCombo";
+ this.TypeCombo.Size = new System.Drawing.Size(389, 50);
+ this.TypeCombo.TabIndex = 0;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(9, 12);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(130, 42);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "タイプ:";
+ //
+ // TypeAPanel
+ //
+ this.TypeAPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.TypeAPanel.Controls.Add(this.KoteichiText);
+ this.TypeAPanel.Controls.Add(this.label2);
+ this.TypeAPanel.Location = new System.Drawing.Point(3, 77);
+ this.TypeAPanel.Name = "TypeAPanel";
+ this.TypeAPanel.Size = new System.Drawing.Size(543, 151);
+ this.TypeAPanel.TabIndex = 1;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(9, 12);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(130, 42);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "固定値:";
+ //
+ // KoteichiText
+ //
+ this.KoteichiText.Location = new System.Drawing.Point(145, 9);
+ this.KoteichiText.Name = "KoteichiText";
+ this.KoteichiText.Size = new System.Drawing.Size(389, 49);
+ this.KoteichiText.TabIndex = 3;
+ //
+ // EditColumnForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(549, 267);
+ this.Controls.Add(this.BasePanel);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "EditColumnForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "列編集";
+ this.BasePanel.ResumeLayout(false);
+ this.MainTableLayoutPanel.ResumeLayout(false);
+ this.HeaderPanel.ResumeLayout(false);
+ this.HeaderPanel.PerformLayout();
+ this.TypeAPanel.ResumeLayout(false);
+ this.TypeAPanel.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel BasePanel;
+ private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;
+ private System.Windows.Forms.Panel HeaderPanel;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.ComboBox TypeCombo;
+ private System.Windows.Forms.Panel TypeAPanel;
+ private System.Windows.Forms.TextBox KoteichiText;
+ private System.Windows.Forms.Label label2;
+ }
+}
\ No newline at end of file
diff --git a/src/ReiaSanTool/Gamen/EditColumnForm.cs b/src/ReiaSanTool/Gamen/EditColumnForm.cs
new file mode 100644
index 0000000..c663590
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/EditColumnForm.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ReiaSanTool.Gamen
+{
+ public partial class EditColumnForm : Form
+ {
+ public EditColumnForm()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Gamen/EditColumnForm.resx b/src/ReiaSanTool/Gamen/EditColumnForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/EditColumnForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ReiaSanTool/Gamen/MainForm.Designer.cs b/src/ReiaSanTool/Gamen/MainForm.Designer.cs
new file mode 100644
index 0000000..9e86c84
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/MainForm.Designer.cs
@@ -0,0 +1,96 @@
+namespace ReiaSanTool.Gamen
+{
+ partial class MainForm
+ {
+ ///
+ /// 必要なデザイナー変数です。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 使用中のリソースをすべてクリーンアップします。
+ ///
+ /// マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows フォーム デザイナーで生成されたコード
+
+ ///
+ /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
+ /// コード エディターで変更しないでください。
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.IniPropGrid = new System.Windows.Forms.PropertyGrid();
+ this.PopupMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.HozonMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.OpenMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.PopupMenu.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // IniPropGrid
+ //
+ this.IniPropGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.IniPropGrid.Location = new System.Drawing.Point(12, 12);
+ this.IniPropGrid.Name = "IniPropGrid";
+ this.IniPropGrid.Size = new System.Drawing.Size(580, 274);
+ this.IniPropGrid.TabIndex = 0;
+ //
+ // PopupMenu
+ //
+ this.PopupMenu.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.PopupMenu.ImageScalingSize = new System.Drawing.Size(24, 24);
+ this.PopupMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.HozonMenu,
+ this.OpenMenu});
+ this.PopupMenu.Name = "PopupMenu";
+ this.PopupMenu.Size = new System.Drawing.Size(241, 133);
+ //
+ // HozonMenu
+ //
+ this.HozonMenu.Name = "HozonMenu";
+ this.HozonMenu.Size = new System.Drawing.Size(240, 48);
+ this.HozonMenu.Text = "保存";
+ this.HozonMenu.Click += new System.EventHandler(this.HozonMenu_Click);
+ //
+ // OpenMenu
+ //
+ this.OpenMenu.Name = "OpenMenu";
+ this.OpenMenu.Size = new System.Drawing.Size(240, 48);
+ this.OpenMenu.Text = "開く...";
+ this.OpenMenu.Click += new System.EventHandler(this.OpenMenu_Click);
+ //
+ // MainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(604, 298);
+ this.ContextMenuStrip = this.PopupMenu;
+ this.Controls.Add(this.IniPropGrid);
+ this.Name = "MainForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "れいあさんツール💖";
+ this.PopupMenu.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.PropertyGrid IniPropGrid;
+ private System.Windows.Forms.ContextMenuStrip PopupMenu;
+ private System.Windows.Forms.ToolStripMenuItem HozonMenu;
+ private System.Windows.Forms.ToolStripMenuItem OpenMenu;
+ }
+}
+
diff --git a/src/ReiaSanTool/Gamen/MainForm.cs b/src/ReiaSanTool/Gamen/MainForm.cs
new file mode 100644
index 0000000..2a4e008
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/MainForm.cs
@@ -0,0 +1,72 @@
+using ExcelToCsvToDbCommon.Class;
+using ReiaSanTool.Class;
+using ReiaSanTool.Dto;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ReiaSanTool.Gamen
+{
+ public partial class MainForm : Form
+ {
+ // フォーム側
+ //private BindingList _configs = new BindingList();
+ private IniConfigContainer _container = new IniConfigContainer();
+
+ public MainForm()
+ {
+ InitializeComponent();
+
+ // リストにデータを追加
+ //_configs.Add(new ColumnDefinition { LogicalName = "PlanCd", Type = ColumnType.Fixed, FixedValue = "K*SP**" });
+
+ // テストデータを1つ入れておく
+ _container.Columns.Add(new ColumnDefinition
+ {
+ LogicalName = "PlanCd",
+ Type = ColumnType.Fixed,
+ FixedValue = "K*SP**"
+ });
+
+
+ // まとめてセット!
+ IniPropGrid.SelectedObject = _container;
+ }
+
+ private void HozonMenu_Click(object sender, EventArgs e)
+ {
+ //_iniAll.Save();
+ }
+
+ private void OpenMenu_Click(object sender, EventArgs e)
+ {
+ using (var dlg = new OpenFileDialog())
+ {
+ dlg.Multiselect = false;
+ dlg.Title = "Settings.ini ファイルを選択してください。";
+ dlg.AddExtension = true;
+ dlg.CheckFileExists = true;
+ dlg.CheckPathExists = true;
+ dlg.RestoreDirectory = true;
+ dlg.Filter = "設定ファイル(*.ini)";
+ // 最初に見せるフォルダ(デスクトップなど)
+ //dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
+
+ // ダイアログを表示して「OK」が押されたら処理
+ if (dlg.ShowDialog() == DialogResult.Cancel) return;
+
+ // 選択されたファイルのパスを取得
+ string filePath = dlg.FileName;
+
+ //ここから。。。やめた!中断!🔥🌊
+ }
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Gamen/MainForm.resx b/src/ReiaSanTool/Gamen/MainForm.resx
new file mode 100644
index 0000000..37ff906
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/MainForm.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/src/ReiaSanTool/Gamen/NewMainForm.Designer.cs b/src/ReiaSanTool/Gamen/NewMainForm.Designer.cs
new file mode 100644
index 0000000..6b94542
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/NewMainForm.Designer.cs
@@ -0,0 +1,251 @@
+namespace ReiaSanTool.Gamen
+{
+ partial class NewMainForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+ this.IniDgv = new System.Windows.Forms.DataGridView();
+ this.colNo = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.colName = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.colType = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.colNaiyo = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.colComment = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.ContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.OpenMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.SetteiMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.MenuFontMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.TitleMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.VersionMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.RowMoveMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.RowUpMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.RowDownMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.SaveMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.ExcelViewMenu = new System.Windows.Forms.ToolStripMenuItem();
+ ((System.ComponentModel.ISupportInitialize)(this.IniDgv)).BeginInit();
+ this.ContextMenu.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // IniDgv
+ //
+ this.IniDgv.AllowUserToAddRows = false;
+ this.IniDgv.AllowUserToDeleteRows = false;
+ this.IniDgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.IniDgv.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.colNo,
+ this.colName,
+ this.colType,
+ this.colNaiyo,
+ this.colComment});
+ this.IniDgv.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.IniDgv.Location = new System.Drawing.Point(0, 0);
+ this.IniDgv.Name = "IniDgv";
+ this.IniDgv.ReadOnly = true;
+ this.IniDgv.RowHeadersVisible = false;
+ this.IniDgv.RowHeadersWidth = 62;
+ this.IniDgv.RowTemplate.Height = 27;
+ this.IniDgv.Size = new System.Drawing.Size(617, 168);
+ this.IniDgv.TabIndex = 0;
+ //
+ // colNo
+ //
+ dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
+ this.colNo.DefaultCellStyle = dataGridViewCellStyle1;
+ this.colNo.HeaderText = "No";
+ this.colNo.MinimumWidth = 8;
+ this.colNo.Name = "colNo";
+ this.colNo.ReadOnly = true;
+ this.colNo.Width = 150;
+ //
+ // colName
+ //
+ this.colName.HeaderText = "名前";
+ this.colName.MinimumWidth = 8;
+ this.colName.Name = "colName";
+ this.colName.ReadOnly = true;
+ this.colName.Width = 150;
+ //
+ // colType
+ //
+ this.colType.HeaderText = "タイプ";
+ this.colType.MinimumWidth = 8;
+ this.colType.Name = "colType";
+ this.colType.ReadOnly = true;
+ this.colType.Width = 150;
+ //
+ // colNaiyo
+ //
+ this.colNaiyo.HeaderText = "内容";
+ this.colNaiyo.MinimumWidth = 8;
+ this.colNaiyo.Name = "colNaiyo";
+ this.colNaiyo.ReadOnly = true;
+ this.colNaiyo.Width = 150;
+ //
+ // colComment
+ //
+ this.colComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+ this.colComment.HeaderText = "コメント";
+ this.colComment.MinimumWidth = 8;
+ this.colComment.Name = "colComment";
+ this.colComment.ReadOnly = true;
+ //
+ // ContextMenu
+ //
+ this.ContextMenu.ImageScalingSize = new System.Drawing.Size(24, 24);
+ this.ContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.OpenMenu,
+ this.SetteiMenu,
+ this.RowMoveMenu,
+ this.SaveMenu,
+ this.VersionMenu,
+ this.ExcelViewMenu});
+ this.ContextMenu.Name = "ContextMenu";
+ this.ContextMenu.Size = new System.Drawing.Size(241, 229);
+ this.ContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenu_Opening);
+ //
+ // OpenMenu
+ //
+ this.OpenMenu.Name = "OpenMenu";
+ this.OpenMenu.Size = new System.Drawing.Size(240, 32);
+ this.OpenMenu.Text = "開く...";
+ this.OpenMenu.Click += new System.EventHandler(this.OpenMenu_Click);
+ //
+ // SetteiMenu
+ //
+ this.SetteiMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.MenuFontMenu,
+ this.TitleMenu});
+ this.SetteiMenu.Name = "SetteiMenu";
+ this.SetteiMenu.Size = new System.Drawing.Size(240, 32);
+ this.SetteiMenu.Text = "設定";
+ //
+ // MenuFontMenu
+ //
+ this.MenuFontMenu.Name = "MenuFontMenu";
+ this.MenuFontMenu.Size = new System.Drawing.Size(240, 34);
+ this.MenuFontMenu.Text = "メニューのフォント...";
+ this.MenuFontMenu.Click += new System.EventHandler(this.MenuFontMenu_Click);
+ //
+ // TitleMenu
+ //
+ this.TitleMenu.Name = "TitleMenu";
+ this.TitleMenu.Size = new System.Drawing.Size(240, 34);
+ this.TitleMenu.Text = "タイトル...";
+ this.TitleMenu.Click += new System.EventHandler(this.TitleMenu_Click);
+ //
+ // VersionMenu
+ //
+ this.VersionMenu.Name = "VersionMenu";
+ this.VersionMenu.Size = new System.Drawing.Size(240, 32);
+ this.VersionMenu.Text = "バージョン";
+ //
+ // RowMoveMenu
+ //
+ this.RowMoveMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.RowUpMenu,
+ this.RowDownMenu});
+ this.RowMoveMenu.Name = "RowMoveMenu";
+ this.RowMoveMenu.Size = new System.Drawing.Size(240, 32);
+ this.RowMoveMenu.Text = "行移動";
+ this.RowMoveMenu.DropDownOpening += new System.EventHandler(this.RowMoveMenu_DropDownOpening);
+ //
+ // RowUpMenu
+ //
+ this.RowUpMenu.Name = "RowUpMenu";
+ this.RowUpMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up)));
+ this.RowUpMenu.Size = new System.Drawing.Size(312, 34);
+ this.RowUpMenu.Text = "👆行UP";
+ this.RowUpMenu.Click += new System.EventHandler(this.RowUpMenu_Click);
+ //
+ // RowDownMenu
+ //
+ this.RowDownMenu.Name = "RowDownMenu";
+ this.RowDownMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down)));
+ this.RowDownMenu.Size = new System.Drawing.Size(312, 34);
+ this.RowDownMenu.Text = "👇行DOWN";
+ this.RowDownMenu.Click += new System.EventHandler(this.RowDownMenu_Click);
+ //
+ // SaveMenu
+ //
+ this.SaveMenu.Name = "SaveMenu";
+ this.SaveMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+ this.SaveMenu.Size = new System.Drawing.Size(240, 32);
+ this.SaveMenu.Text = "保存";
+ this.SaveMenu.Click += new System.EventHandler(this.SaveMenu_Click);
+ //
+ // ExcelViewMenu
+ //
+ this.ExcelViewMenu.Name = "ExcelViewMenu";
+ this.ExcelViewMenu.Size = new System.Drawing.Size(240, 32);
+ this.ExcelViewMenu.Text = "Excelビュー...";
+ this.ExcelViewMenu.Click += new System.EventHandler(this.ExcelViewMenu_Click);
+ //
+ // NewMainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 42F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(617, 168);
+ this.ContextMenuStrip = this.ContextMenu;
+ this.Controls.Add(this.IniDgv);
+ this.Font = new System.Drawing.Font("メイリオ", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
+ this.KeyPreview = true;
+ this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
+ this.Name = "NewMainForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "れいあさんツールズ💖";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.NewMainForm_FormClosing);
+ this.Load += new System.EventHandler(this.NewMainForm_Load);
+ this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.NewMainForm_KeyDown);
+ ((System.ComponentModel.ISupportInitialize)(this.IniDgv)).EndInit();
+ this.ContextMenu.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DataGridView IniDgv;
+ private System.Windows.Forms.ContextMenuStrip ContextMenu;
+ private System.Windows.Forms.ToolStripMenuItem SetteiMenu;
+ private System.Windows.Forms.ToolStripMenuItem MenuFontMenu;
+ private System.Windows.Forms.ToolStripMenuItem VersionMenu;
+ private System.Windows.Forms.ToolStripMenuItem TitleMenu;
+ private System.Windows.Forms.ToolStripMenuItem OpenMenu;
+ private System.Windows.Forms.DataGridViewTextBoxColumn colNo;
+ private System.Windows.Forms.DataGridViewTextBoxColumn colName;
+ private System.Windows.Forms.DataGridViewTextBoxColumn colType;
+ private System.Windows.Forms.DataGridViewTextBoxColumn colNaiyo;
+ private System.Windows.Forms.DataGridViewTextBoxColumn colComment;
+ private System.Windows.Forms.ToolStripMenuItem RowMoveMenu;
+ private System.Windows.Forms.ToolStripMenuItem RowUpMenu;
+ private System.Windows.Forms.ToolStripMenuItem RowDownMenu;
+ private System.Windows.Forms.ToolStripMenuItem SaveMenu;
+ private System.Windows.Forms.ToolStripMenuItem ExcelViewMenu;
+ }
+}
\ No newline at end of file
diff --git a/src/ReiaSanTool/Gamen/NewMainForm.cs b/src/ReiaSanTool/Gamen/NewMainForm.cs
new file mode 100644
index 0000000..5898916
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/NewMainForm.cs
@@ -0,0 +1,158 @@
+using ExcelToCsvToDbCommon.Class;
+using KssSmaPlaLib.Forms;
+using KssSmaPlaLib.Ini;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ReiaSanTool.Gamen
+{
+ public partial class NewMainForm : Form
+ {
+ private string _iniPath = string.Empty;
+
+ public NewMainForm()
+ {
+ InitializeComponent();
+ }
+
+ private void NewMainForm_Load(object sender, EventArgs e)
+ {
+ SetTitleWithIniPath();
+ FormHelper.LoadFormBounds(this);
+ DgvHelper.Initialize(IniDgv);
+ DgvHelper.DgvLoadColWidth(IniDgv);
+ ContextMenuHelper.SetFont(this, ContextMenu);
+ }
+
+ private void SetTitleWithIniPath()
+ {
+ FormHelper.SetTitle(this);
+ if (!string.IsNullOrEmpty(_iniPath))
+ {
+ this.Text = this.Text + " - " + _iniPath;
+ }
+ }
+
+ private void NewMainForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ FormHelper.SaveFormBounds(this);
+ DgvHelper.DgvSaveColWidth(IniDgv);
+ }
+
+ private void ContextMenu_Opening(object sender, CancelEventArgs e)
+ {
+ SaveMenu.Enabled = !string.IsNullOrEmpty(_iniPath);
+ ContextMenuHelper.DispVersion(VersionMenu);
+ }
+
+ private void MenuFontMenu_Click(object sender, EventArgs e)
+ {
+ ContextMenuHelper.SelectMenuFont(this, ContextMenu);
+ }
+
+ private void TitleMenu_Click(object sender, EventArgs e)
+ {
+ ContextMenuHelper.SetFormTitle(this);
+ }
+
+ private void OpenMenu_Click(object sender, EventArgs e)
+ {
+ var iniPath = IniHelper.OpenIni();
+ if (string.IsNullOrEmpty(iniPath)) return;
+
+ LoadGrid(ColumnDefinition.Load(iniPath, "ExcelToCsvPoSpIni"));
+ _iniPath = iniPath;
+ SetTitleWithIniPath();
+ }
+
+ private void LoadGrid(List cdList)
+ {
+ IniDgv.Rows.Clear();
+ for (int cnt = 0; cnt < cdList.Count; cnt++)
+ {
+ var rowIndex = IniDgv.Rows.Add();
+ IniDgv.Rows[rowIndex].Cells["colNo"].Value = cnt + 1;
+ IniDgv.Rows[rowIndex].Cells["colName"].Value = cdList[cnt].LogicalName;
+ IniDgv.Rows[rowIndex].Cells["colType"].Value = cdList[cnt].TypeName;
+ IniDgv.Rows[rowIndex].Cells["colNaiyo"].Value = cdList[cnt].Naiyo;
+ IniDgv.Rows[rowIndex].Cells["colComment"].Value = cdList[cnt].Comment;
+ IniDgv.Rows[rowIndex].Tag = cdList[cnt];
+ }
+ }
+
+ private void RowMoveMenu_DropDownOpening(object sender, EventArgs e)
+ {
+ RowUpMenu.Enabled = false;
+ RowDownMenu.Enabled = false;
+ if (IniDgv.SelectedRows.Count == 0) return;
+
+ RowUpMenu.Enabled = IniDgv.SelectedRows[0].Index != 0;
+ RowDownMenu.Enabled = IniDgv.SelectedRows[0].Index != IniDgv.Rows.Count - 1;
+ }
+
+ private void RowUpMenu_Click(object sender, EventArgs e)
+ {
+ if (IniDgv.SelectedRows.Count == 0) return;
+
+ DgvHelper.MoveRow(IniDgv, IniDgv.SelectedRows[0].Index, true);
+ NoFurinaoshi();
+ }
+
+ private void RowDownMenu_Click(object sender, EventArgs e)
+ {
+ if (IniDgv.SelectedRows.Count == 0) return;
+
+ DgvHelper.MoveRow(IniDgv, IniDgv.SelectedRows[0].Index, false);
+ NoFurinaoshi();
+ }
+ private void NoFurinaoshi()
+ {
+ for (int cnt = 0; cnt < IniDgv.Rows.Count; cnt++)
+ {
+ IniDgv.Rows[cnt].Cells["colNo"].Value = cnt + 1;
+ }
+ }
+
+ private void SaveMenu_Click(object sender, EventArgs e)
+ {
+ // 一旦Col行をすべて削除
+ for (var cnt = 1; cnt <= 999; cnt++)
+ IniHelper.WriteValue(_iniPath, "ExcelToCsvPoSpIni", $"Col{cnt:D3}", null);
+
+ for (var cnt = 0; cnt < IniDgv.Rows.Count; cnt++)
+ {
+ var cd = IniDgv.Rows[cnt].Tag as ColumnDefinition;
+ if (cd is null) continue;
+ IniHelper.WriteValue(_iniPath, "ExcelToCsvPoSpIni", $"Col{cnt + 1:D3}", cd.IniRaw());
+ }
+
+ ToastNotifier.Show(this, "保存しました。", Color.SeaGreen);
+ }
+
+ private void NewMainForm_KeyDown(object sender, KeyEventArgs e)
+ {
+ // Enabled制御をしておく
+ ContextMenu_Opening(null, null);
+ RowMoveMenu_DropDownOpening(null, null);
+
+ // ショートカット実行!(本来はメニューを開いているときか効かない!)
+ if (ContextMenuHelper.ExecuteShortcutWithEnabledCheck(ContextMenu.Items, e.KeyData))
+ {
+ e.Handled = true;
+ }
+ }
+
+ private void ExcelViewMenu_Click(object sender, EventArgs e)
+ {
+ using(var frm=new SelectExcelColumnForm(
+ ""))
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Gamen/NewMainForm.resx b/src/ReiaSanTool/Gamen/NewMainForm.resx
new file mode 100644
index 0000000..01b8d18
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/NewMainForm.resx
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/src/ReiaSanTool/Gamen/SelectExcelColumnForm.Designer.cs b/src/ReiaSanTool/Gamen/SelectExcelColumnForm.Designer.cs
new file mode 100644
index 0000000..b5bb2e8
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/SelectExcelColumnForm.Designer.cs
@@ -0,0 +1,66 @@
+namespace ReiaSanTool.Gamen
+{
+ partial class SelectExcelColumnForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.ExcelDgv = new System.Windows.Forms.DataGridView();
+ ((System.ComponentModel.ISupportInitialize)(this.ExcelDgv)).BeginInit();
+ this.SuspendLayout();
+ //
+ // ExcelDgv
+ //
+ this.ExcelDgv.AllowUserToAddRows = false;
+ this.ExcelDgv.AllowUserToDeleteRows = false;
+ this.ExcelDgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.ExcelDgv.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.ExcelDgv.Location = new System.Drawing.Point(0, 0);
+ this.ExcelDgv.Name = "ExcelDgv";
+ this.ExcelDgv.ReadOnly = true;
+ this.ExcelDgv.RowHeadersWidth = 62;
+ this.ExcelDgv.RowTemplate.Height = 27;
+ this.ExcelDgv.Size = new System.Drawing.Size(429, 255);
+ this.ExcelDgv.TabIndex = 0;
+ //
+ // SelectExcelColumnForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(429, 255);
+ this.Controls.Add(this.ExcelDgv);
+ this.Name = "SelectExcelColumnForm";
+ this.Text = "列を選択してください。";
+ ((System.ComponentModel.ISupportInitialize)(this.ExcelDgv)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DataGridView ExcelDgv;
+ }
+}
\ No newline at end of file
diff --git a/src/ReiaSanTool/Gamen/SelectExcelColumnForm.cs b/src/ReiaSanTool/Gamen/SelectExcelColumnForm.cs
new file mode 100644
index 0000000..88b826e
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/SelectExcelColumnForm.cs
@@ -0,0 +1,65 @@
+using ClosedXML;
+using ClosedXML.Excel;
+using KssSmaPlaLib.IO.Excel;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ReiaSanTool.Gamen
+{
+ public partial class SelectExcelColumnForm : Form
+ {
+ private string _excelFilePath = string.Empty;
+ public SelectExcelColumnForm(string excelFilePath)
+ {
+ _excelFilePath = excelFilePath;
+
+ InitializeComponent();
+
+ PreviewExcel(_excelFilePath, ExcelDgv);
+ }
+
+ public void PreviewExcel(string filePath, DataGridView dgv)
+ {
+ // 1. DataTableを準備(DataGridViewに流し込む用)
+ DataTable dt = new DataTable();
+
+ using (var workbook = new XLWorkbook(filePath))
+ {
+ // 最初のシートを取得
+ var worksheet = workbook.Worksheets.First();
+
+ // 2. 100x100の範囲を指定(データがある範囲+100の小さい方)
+ int maxRows = Math.Min(worksheet.LastRowUsed().RowNumber(), 100);
+ int maxCols = Math.Min(worksheet.LastColumnUsed().ColumnNumber(), 100);
+
+ // 3. 列(ヘッダー)を作成
+ for (int i = 1; i <= maxCols; i++)
+ {
+ // 列名を "A", "B", "C"... にする(さっきの変換メソッドを使ってもOK!)
+ dt.Columns.Add(ExcelColumnHelperUxer.GetExcelColumnLetter(i));
+ }
+
+ // 4. 行データを流し込む
+ for (int r = 1; r <= maxRows; r++)
+ {
+ var newRow = dt.NewRow();
+ for (int c = 1; c <= maxCols; c++)
+ {
+ newRow[c - 1] = worksheet.Cell(r, c).Value;
+ }
+ dt.Rows.Add(newRow);
+ }
+ }
+
+ // 5. DataGridViewに一気にセット(神設定のDoubleBufferedをお忘れなく!)
+ dgv.DataSource = dt;
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Gamen/SelectExcelColumnForm.resx b/src/ReiaSanTool/Gamen/SelectExcelColumnForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/src/ReiaSanTool/Gamen/SelectExcelColumnForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ReiaSanTool/Program.cs b/src/ReiaSanTool/Program.cs
new file mode 100644
index 0000000..59c0336
--- /dev/null
+++ b/src/ReiaSanTool/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ReiaSanTool
+{
+ internal static class Program
+ {
+ ///
+ /// アプリケーションのメイン エントリ ポイントです。
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Gamen.NewMainForm());
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Properties/AssemblyInfo.cs b/src/ReiaSanTool/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..474fa8f
--- /dev/null
+++ b/src/ReiaSanTool/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// アセンブリに関する一般的な情報は、次の方法で制御されます
+// 制御されます。アセンブリに関連付けられている情報を変更するには、
+// これらの属性値を変更します。
+[assembly: AssemblyTitle("ReiaSanTool")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("本田技研工業株式会社")]
+[assembly: AssemblyProduct("ReiaSanTool")]
+[assembly: AssemblyCopyright("Copyright © 本田技研工業株式会社 2026")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
+// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
+// その型の ComVisible 属性を true に設定してください。
+[assembly: ComVisible(false)]
+
+// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります
+[assembly: Guid("6434a0da-0c7e-46b8-99b9-b7c31f7b6f9d")]
+
+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
+//
+// メジャー バージョン
+// マイナー バージョン
+// ビルド番号
+// リビジョン
+//
+[assembly: AssemblyVersion("0.1.0.0")]
+[assembly: AssemblyFileVersion("0.1.0.0")]
diff --git a/src/ReiaSanTool/Properties/Resources.Designer.cs b/src/ReiaSanTool/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..d78387c
--- /dev/null
+++ b/src/ReiaSanTool/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// このコードはツールによって生成されました。
+// ランタイム バージョン:4.0.30319.42000
+//
+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
+// コードが再生成されるときに損失したりします
+//
+//------------------------------------------------------------------------------
+
+namespace ReiaSanTool.Properties
+{
+
+
+ ///
+ /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
+ ///
+ // このクラスは StronglyTypedResourceBuilder クラスが ResGen
+ // または Visual Studio のようなツールを使用して自動生成されました。
+ // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
+ // ResGen を実行し直すか、または VS プロジェクトをリビルドします。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// このクラスで使用されるキャッシュされた ResourceManager インスタンスを返します。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ReiaSanTool.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// すべてについて、現在のスレッドの CurrentUICulture プロパティをオーバーライドします
+ /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Properties/Resources.resx b/src/ReiaSanTool/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/src/ReiaSanTool/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/ReiaSanTool/Properties/Settings.Designer.cs b/src/ReiaSanTool/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..8fdcef5
--- /dev/null
+++ b/src/ReiaSanTool/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ReiaSanTool.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/src/ReiaSanTool/Properties/Settings.settings b/src/ReiaSanTool/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/src/ReiaSanTool/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/ReiaSanTool/ReiaSanTool.csproj b/src/ReiaSanTool/ReiaSanTool.csproj
new file mode 100644
index 0000000..38a427b
--- /dev/null
+++ b/src/ReiaSanTool/ReiaSanTool.csproj
@@ -0,0 +1,162 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {6434A0DA-0C7E-46B8-99B9-B7C31F7B6F9D}
+ WinExe
+ ReiaSanTool
+ ReiaSanTool
+ v4.8
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ packages\ClosedXML.0.105.0\lib\netstandard2.0\ClosedXML.dll
+
+
+ packages\ClosedXML.Parser.2.0.0\lib\netstandard2.0\ClosedXML.Parser.dll
+
+
+ packages\DocumentFormat.OpenXml.3.1.1\lib\net46\DocumentFormat.OpenXml.dll
+
+
+ packages\DocumentFormat.OpenXml.Framework.3.1.1\lib\net46\DocumentFormat.OpenXml.Framework.dll
+
+
+ packages\ExcelNumberFormat.1.1.0\lib\net20\ExcelNumberFormat.dll
+
+
+ packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll
+
+
+ packages\RBush.Signed.4.0.0\lib\net47\RBush.dll
+
+
+ packages\SixLabors.Fonts.1.0.0\lib\netstandard2.0\SixLabors.Fonts.dll
+
+
+
+ packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll
+
+
+
+ packages\System.Memory.4.5.5\lib\net461\System.Memory.dll
+
+
+
+ packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll
+
+
+ packages\System.Runtime.CompilerServices.Unsafe.4.7.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ EditColumnForm.cs
+
+
+ Form
+
+
+ MainForm.cs
+
+
+ Form
+
+
+ NewMainForm.cs
+
+
+ Form
+
+
+ SelectExcelColumnForm.cs
+
+
+
+
+ EditColumnForm.cs
+
+
+ MainForm.cs
+
+
+ NewMainForm.cs
+
+
+ SelectExcelColumnForm.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}
+ KssSmaPlaLib
+
+
+ {9f267a81-8387-46f7-a299-cfc26216f895}
+ ExcelToCsvToDbCommon
+
+
+
+
\ No newline at end of file
diff --git a/src/ReiaSanTool/ReiaSanTool.sln b/src/ReiaSanTool/ReiaSanTool.sln
new file mode 100644
index 0000000..0a1c1c7
--- /dev/null
+++ b/src/ReiaSanTool/ReiaSanTool.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.37012.4 d17.14
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReiaSanTool", "ReiaSanTool.csproj", "{6434A0DA-0C7E-46B8-99B9-B7C31F7B6F9D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KssSmaPlaLib", "..\..\..\SharedLibs\KssSmaPlaLib\KssSmaPlaLib.csproj", "{4136CE96-10AA-4B55-B49F-68C80E9E3BC8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExcelToCsvToDb", "..\ExcelToCsvToDb\ExcelToCsvToDb.csproj", "{6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExcelToCsvToDbCommon", "..\ExcelToCsvToDbCommon\ExcelToCsvToDbCommon.csproj", "{9F267A81-8387-46F7-A299-CFC26216F895}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6434A0DA-0C7E-46B8-99B9-B7C31F7B6F9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6434A0DA-0C7E-46B8-99B9-B7C31F7B6F9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6434A0DA-0C7E-46B8-99B9-B7C31F7B6F9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6434A0DA-0C7E-46B8-99B9-B7C31F7B6F9D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4136CE96-10AA-4B55-B49F-68C80E9E3BC8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6E9D8E26-7349-4FB9-BACF-8B1DC498E08B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9F267A81-8387-46F7-A299-CFC26216F895}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {9A62B94E-02D7-46B3-BD5C-A681863D0F00}
+ EndGlobalSection
+EndGlobal
diff --git a/src/ReiaSanTool/packages.config b/src/ReiaSanTool/packages.config
new file mode 100644
index 0000000..c7c7ac0
--- /dev/null
+++ b/src/ReiaSanTool/packages.config
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file