From 09c968ea7fedd5d04d67537f42c4ef4b8c3782ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E5=87=AF?= Date: Mon, 17 Feb 2025 14:51:54 +0800 Subject: [PATCH] =?UTF-8?q?excel=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CNAS_RunSync/ucSynchrousMain.cs | 16 +- .../InsturmentData/ExcelInstrumentData.cs | 175 ++++++++++++++---- .../InsturmentData/TXTInstrumentData.cs | 14 +- CnasSynchronusClient/RemoteFileCopy.cs | 30 ++- 4 files changed, 190 insertions(+), 45 deletions(-) diff --git a/CNAS_RunSync/ucSynchrousMain.cs b/CNAS_RunSync/ucSynchrousMain.cs index 330d4fe..71f99e7 100644 --- a/CNAS_RunSync/ucSynchrousMain.cs +++ b/CNAS_RunSync/ucSynchrousMain.cs @@ -80,6 +80,13 @@ namespace CNAS_RunSync this.lblTitleLastUpdateTime.Text = $"最近上传时间:{times[this.syncInstrumentItem.Code]}"; } + //获取配置 + SystemFormatConfig systemConfig = FileOperation.GetSystemFormatConfigData(this.syncInstrumentItem.Code); + if (null != systemConfig) + { + this.delayDays = systemConfig.ShowDelayDays; + } + //清空现有绑定 DictComboBox.Clear(); dictSource.Clear(); @@ -165,7 +172,14 @@ namespace CNAS_RunSync dtSource = instrumentData.GetInstrumentDataByDate(); DataView dv = dtSource.DefaultView; - dv.Sort = $"{query[0].SourceField} DESC"; + try + { + dv.Sort = $"{query[0].SourceField} DESC"; + } + catch + { + + } dtSource = dv.ToTable(); } diff --git a/CnasSynchronusClient/InsturmentData/ExcelInstrumentData.cs b/CnasSynchronusClient/InsturmentData/ExcelInstrumentData.cs index b28dd70..42ebaa5 100644 --- a/CnasSynchronusClient/InsturmentData/ExcelInstrumentData.cs +++ b/CnasSynchronusClient/InsturmentData/ExcelInstrumentData.cs @@ -5,6 +5,7 @@ using CnasSynchrousModel; using System; using System.Collections.Generic; using System.Data; +using System.IO; using System.Linq; using System.Text; @@ -24,36 +25,60 @@ namespace CnasSynchronusClient public ExcelFormatConfig ExcelFormat { get; set; } + /// + /// 如果配置读取的是文件夹,该属性用来记录需要读取所有文件的缓冲路径 + /// + public List LstFileFullName { get; set; } + public ExcelInstrumentData(InstrumentDataSourceInfo dataSourceInfo, object[] vs) { - if (dataSourceInfo.Path == null) return; + if (dataSourceInfo.Path == null) + { + return; + } + + this.ExcelFormat = FileOperation.GetFormatConfigData("ExcelFormatConfig.xml"); + try { - ExcelFormat = FileOperation.GetFormatConfigData("ExcelFormatConfig.xml"); + LstFileFullName = new List(); + // 此时为读取“文件”模式,指定要读取的具体文件 if (ExcelFormat.ReadExcelFileMode == "0") { RemoteFileCopy remoteFileCopy = new RemoteFileCopy(dataSourceInfo); remoteFileCopy.CopyFileFromRemote(".xls"); - this.StrLocalPath = FileHelper.getBasePath() + "\\Cache\\" + System.Text.RegularExpressions.Regex.Replace(dataSourceInfo.Path, "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + ".xls"; - this.strTableName = vs[0].ToString(); + + this.StrLocalPath = FileHelper.getBasePath() + "\\Cache\\" + System.Text.RegularExpressions.Regex.Replace(dataSourceInfo.Path, "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + ".xls"; + this.strTableName = vs[0].ToString(); this.strDateColumn = vs[1].ToString(); - this.strDate = vs[2].ToString(); + this.strDate = vs[2].ToString(); + + LstFileFullName.Add(StrLocalPath); } + // 此时为读取“文件夹”模式,指定要读取的具体文件 else { - string strFileName = DateTime.Now.ToString(ExcelFormat.ExcelFileNameFormat); - - if (strFileName != "") + DirectoryInfo root = new DirectoryInfo($"{dataSourceInfo.Path}"); + foreach (FileInfo f in root.GetFiles()) { - RemoteFileCopy remoteFileCopy = new RemoteFileCopy(dataSourceInfo); - remoteFileCopy.CopyFileFromRemote(".xls", strFileName + ".xls"); + string name = f.Name; + string fullName = f.FullName; + string type = f.Extension; - this.StrLocalPath = FileHelper.getBasePath() + "\\Cache\\" + System.Text.RegularExpressions.Regex.Replace(dataSourceInfo.Path+ strFileName + ".xls", "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + ".xls"; - this.strTableName = $"'{strFileName}$'"; - this.strDateColumn = vs[1].ToString(); - this.strDate = vs[2].ToString(); + //“今天”产生的数据,并且格式是xls + if ((type.ToLower() == ".xls".ToLower() || type.ToLower() == ".xlsx".ToLower()) && + name.StartsWith(DateTime.Now.ToString(ExcelFormat.ExcelFileNameFormat))) + { + RemoteFileCopy remoteFileCopy = new RemoteFileCopy(dataSourceInfo); + remoteFileCopy.CopyFileFromRemote(".xls", $"{name}"); + LstFileFullName.Add(FileHelper.getBasePath() + "\\Cache\\" + System.Text.RegularExpressions.Regex.Replace(dataSourceInfo.Path + $"{name}", "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + ".xls"); + } } + + this.strTableName = vs[0].ToString(); + this.strDateColumn = vs[1].ToString(); + this.strDate = vs[2].ToString(); } } catch (Exception ex) @@ -64,33 +89,117 @@ namespace CnasSynchronusClient public override Dictionary GetInstrumentData() { - if (StrLocalPath == null || ExcelFormat == null || ExcelFormat == null) - return new Dictionary(); + Dictionary excels = new Dictionary(); - return dataBaseService.GetInstrumentData( - new ExcelOpenParams + //读取数据 + foreach (var item in LstFileFullName) + { + try { - StrPath = StrLocalPath, - ExcelFileVersion = ExcelFormat.ExcelFileVersion, - autoSql = ExcelFormat.AutoSql - }); + Dictionary datas = dataBaseService.GetInstrumentData( + new ExcelOpenParams + { + StrPath = item, + ExcelFileVersion = ExcelFormat.ExcelFileVersion, + autoSql = ExcelFormat.AutoSql + }); + + foreach (var key in datas.Keys) + { + if (false == excels.ContainsKey(key)) + { + excels.Add(key, datas[key]); + } + else + { + foreach (DataRow dr in datas[key].Rows) + { + DataRow drNew = excels[key].NewRow(); + drNew.ItemArray = dr.ItemArray; + excels[key].Rows.Add(drNew); + } + } + } + } + catch + { + + } + } + + return excels; } public override DataTable GetInstrumentDataByDate() { - return dataBaseService.GetInstrumentDataByDate( - new ExcelOpenParams + DataTable dtCompine = new DataTable(); + + try + { + //读取数据 + List dataTables = new List(); + foreach (var item in LstFileFullName) { - StrPath = StrLocalPath, - ExcelFileVersion = ExcelFormat.ExcelFileVersion, - autoSql = ExcelFormat.AutoSql - }, - new ConditionParams + DataTable dt = dataBaseService.GetInstrumentDataByDate( + new ExcelOpenParams + { + StrPath = item, + ExcelFileVersion = ExcelFormat.ExcelFileVersion, + autoSql = ExcelFormat.AutoSql + }, + new ConditionParams + { + TableName = strTableName, + DateColumn = strDateColumn, + DateValue = strDate + }); + dataTables.Add(dt); + } + + //合并数据 + if (dataTables.Count > 0) { - TableName = strTableName, - DateColumn = strDateColumn, - DateValue = strDate - }); + dtCompine = dataTables[0].Clone(); + foreach (DataTable dt1 in dataTables) + { + foreach (DataRow dr in dt1.Rows) + { + DataRow drNew = dtCompine.NewRow(); + foreach (DataColumn dc in dtCompine.Columns) + { + if (dc.ColumnName.ToString().ToLower() == strDateColumn.ToLower()) + { + DateTime dt = DateTime.Now; + if (DateTime.TryParse(dr[dc.ColumnName].ToString(), out dt)) + { + drNew[dc.ColumnName] = dr[dc.ColumnName].ToString(); + } + else + { + DateTime dtTime = DateTime.ParseExact(dr[dc.ColumnName].ToString(), ExcelFormat.ExcelFileDateColumnFormat, new System.Globalization.CultureInfo("zh-CN", true)); + if (dtTime.ToString("HH:mm:ss") == "00:00:00") + drNew[dc.ColumnName] = dtTime.ToString("yyyy-MM-dd"); + else + drNew[dc.ColumnName] = dtTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + } + else + { + drNew[dc.ColumnName] = dr[dc.ColumnName]; + } + } + dtCompine.Rows.Add(drNew); + } + } + } + } + catch (Exception ex) + { + AppLog.Info("读取数据时发生异常"); + AppLog.Error(ex.Message); + } + AppLog.Info("读取数据完成,准备返回"); + return dtCompine; } public override DataTable GetInstrumentDataStruct() diff --git a/CnasSynchronusClient/InsturmentData/TXTInstrumentData.cs b/CnasSynchronusClient/InsturmentData/TXTInstrumentData.cs index 86a84bb..97d8cc2 100644 --- a/CnasSynchronusClient/InsturmentData/TXTInstrumentData.cs +++ b/CnasSynchronusClient/InsturmentData/TXTInstrumentData.cs @@ -35,16 +35,23 @@ namespace CnasSynchronusClient public TXTInstrumentData(InstrumentDataSourceInfo dataSourceInfo, object[] vs) { - normalFileFormat= FileOperation.GetFormatConfigData("NormalFileFormatConfig.xml"); + if (dataSourceInfo.Path == null) + { + return; + } + + this.normalFileFormat = FileOperation.GetFormatConfigData("NormalFileFormatConfig.xml"); string strSuffix = normalFileFormat.NormalFileSuffix; try { LstFileFullName = new List(); - if (normalFileFormat.ReadNormalFileMode == "0") //此时为读取“文件”模式,指定要读取的具体文件 + + if (normalFileFormat.ReadNormalFileMode == "0") { RemoteFileCopy remoteFileCopy = new RemoteFileCopy(dataSourceInfo); remoteFileCopy.CopyFileFromRemote(strSuffix); + this.StrLocalPath = FileHelper.getBasePath() + "\\Cache\\" + System.Text.RegularExpressions.Regex.Replace(dataSourceInfo.Path, "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + strSuffix; this.strTableName = vs[0].ToString(); this.strDateColumn = vs[1].ToString(); @@ -52,7 +59,8 @@ namespace CnasSynchronusClient LstFileFullName.Add(StrLocalPath); } - else //此时为读取“文件夹”模式,指定要读取的具体文件 + //此时为读取“文件夹”模式,指定要读取的具体文件 + else { //遍历当前路径,找到所有“今天”的数据文件,复制形成缓冲文件 //string strYear = DateTime.Now.Year.ToString(); diff --git a/CnasSynchronusClient/RemoteFileCopy.cs b/CnasSynchronusClient/RemoteFileCopy.cs index 51ae020..9b41e20 100644 --- a/CnasSynchronusClient/RemoteFileCopy.cs +++ b/CnasSynchronusClient/RemoteFileCopy.cs @@ -27,8 +27,12 @@ namespace CnasSynchronusClient public void CopyFileFromRemote(string strPathSuffix,string stAutoFileName=null) { - if (SyncInstrumentDSInfo.Path == null) return; - string[] strRemoteHostMsgs=SyncInstrumentDSInfo.Path.Split(new char[1] { '\\'}, StringSplitOptions.RemoveEmptyEntries); + if (SyncInstrumentDSInfo.Path == null) + { + return; + } + + string[] strRemoteHostMsgs = SyncInstrumentDSInfo.Path.Split(new char[1] { '\\'}, StringSplitOptions.RemoveEmptyEntries); if (strRemoteHostMsgs.Length > 0) { AppLog.Error("CopyFileFromRemote打印日志 "+ SyncInstrumentDSInfo.DsPathType); @@ -36,22 +40,30 @@ namespace CnasSynchronusClient AppLog.Error("CopyFileFromRemote打印日志 " + SyncInstrumentDSInfo.RemoteUser); AppLog.Error("CopyFileFromRemote打印日志 " + SyncInstrumentDSInfo.RemoteUser); AppLog.Error("CopyFileFromRemote打印日志 " + strRemoteHostMsgs[0]); + //执行net user,否则没有权限 if (SyncInstrumentDSInfo.DsPathType == PathType.Remote) - Connect(@"\\"+strRemoteHostMsgs[0], SyncInstrumentDSInfo.RemoteUser, SyncInstrumentDSInfo.RemoteUser); + { + Connect(@"\\" + strRemoteHostMsgs[0], SyncInstrumentDSInfo.RemoteUser, SyncInstrumentDSInfo.RemoteUser); + } AppLog.Error("CopyFileFromRemote打印日志 " + PathType.Remote); + //执行复制 - string strPath = SyncInstrumentDSInfo.Path; - string strCatchPath = FileHelper.getBasePath() + "\\Cache\\"; - string strCopyPath = System.Text.RegularExpressions.Regex.Replace(SyncInstrumentDSInfo.Path, "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + strPathSuffix; + string strPath = SyncInstrumentDSInfo.Path; + string strCatchPath = Path.Combine(FileHelper.getBasePath(), "Cache"); + string strCopyPath = System.Text.RegularExpressions.Regex.Replace(SyncInstrumentDSInfo.Path, "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + strPathSuffix; if (stAutoFileName != null) { if(Path.GetExtension(strPath)=="") + { strPath = strPath + "\\" + stAutoFileName; + } strCopyPath = System.Text.RegularExpressions.Regex.Replace(strPath, "[ \\[ \\] \\^ \\-_*×――(^)|'$%~!@#$…&%¥—+=<>《》!!???::•`·、。,;,.;\"‘’“”-]", "").Replace(@"\", "") + strPathSuffix; if (File.Exists(strCatchPath+strCopyPath)) - File.Delete(strCatchPath+strCopyPath); + { + File.Delete(strCatchPath + strCopyPath); + } } Transport(strPath, strCatchPath, strCopyPath); } @@ -150,6 +162,7 @@ namespace CnasSynchronusClient AppLog.Error("CopyFileFromRemote src 打印日志 " + src); AppLog.Error("CopyFileFromRemote dst 打印日志 " + dst); AppLog.Error("CopyFileFromRemote fileName 打印日志 " + fileName); + try { FileStream inFileStream = new FileStream(src, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); @@ -157,8 +170,9 @@ namespace CnasSynchronusClient { Directory.CreateDirectory(dst); } - dst = dst + fileName; + dst = Path.Combine(dst, fileName); AppLog.Error("CopyFileFromRemote dst 打印日志 " + dst); + FileStream outFileStream = new FileStream(dst, FileMode.OpenOrCreate); byte[] buf = new byte[inFileStream.Length]; int byteCount;