简历档案 测试Excel导入

master
xiaochanghai 6 months ago
parent 4ddbacb327
commit 4488d3d83a
  1. 3
      Tiobon.Core.Common/Helper/StringHelper.cs
  2. 62
      Tiobon.Core.Services/Extensions/ExtensionHelper.cs
  3. 59
      Tiobon.Core.Services/Ghrh/Ghrh_ResumeEduBGServices.cs
  4. 61
      Tiobon.Core.Services/Ghrh/Ghrh_ResumeHomeServices.cs
  5. 54
      Tiobon.Core.Services/Ghrh/Ghrh_ResumeLicenceServices.cs
  6. 58
      Tiobon.Core.Services/Ghrh/Ghrh_ResumeTrainingServices.cs
  7. 58
      Tiobon.Core.Services/Ghrh/Ghrh_ResumeWorkExpServices.cs

@ -121,9 +121,6 @@ public class StringHelper
}
#endregion
#region 格式化数字字符
/// <summary>
/// 格式化数字字符,如传入1.24500,返回1.245

@ -0,0 +1,62 @@
namespace Tiobon.Core.Common.Helper;
public class ExtensionHelper
{
public static async Task<List<ResumeFormColumn1>> QueryResumeFormColumn(ISqlSugarClient Db, string groupType, long resumeTemplateID = 0)
{
resumeTemplateID = await Db.Ado.GetLongAsync("select top 1 Id from Ghrh_ResumeTemplate where IsEnable=1 and IsPublish=1");
var sql = @$"DECLARE @ResumeTemplateID BIGINT = {resumeTemplateID}
SELECT A.ColumnName, A.ResumeInfoColumnName ColumnNameDesc, D.GroupType, A.MapTableName, A.MapColumnName,
A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSourceID
FROM Ghrh_ResumeInfoColumn A
LEFT JOIN Ghrh_ResumeTemplateInfoGroupColumn B
ON B.ResumeInfoColumnID = A.ID
AND B.IsDisplay = 1
AND B.IsEnable = 1
AND A.IsEnable = 1
JOIN Ghrh_ResumeTemplateInfoGroup C
ON B.ResumeTemplateInfoGroupID = C.Id
JOIN Ghrh_ResumeInfoGroup D
ON C.ResumeInfoGroupId = D.ID AND D.IsEnable = 1
WHERE C.ResumeTemplateID = @ResumeTemplateID
AND D.GroupType = '{groupType}' and A.ColumnName !='AttachmentIDs'
ORDER BY D.GroupType, b.SortNo";
return await Db.Ado.SqlQueryAsync<ResumeFormColumn1>(sql);
}
public static async Task<ServiceResult<string>> GenerateReumeArchivesImportTemplate(ISqlSugarClient Db, string groupType, string groupName)
{
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
DataTable dt = new DataTable("TempTable");
var formColumns = await QueryResumeFormColumn(Db, groupType);
string fileName = path + SnowFlakeSingle.instance.getID() + ".xlsx";
if (groupType == "Family")
dt.Columns.Add("简历姓名", typeof(string));
else
dt.Columns.Add("姓名", typeof(string));
formColumns
.ToList()
.ForEach(x =>
{
if (!dt.Columns.Contains(x.ColumnNameDesc))
dt.Columns.Add(x.ColumnNameDesc, typeof(string));
});
var dr = dt.NewRow();
dt.Rows.Add(dr);
NPOIHelper.ExportExcel(dt, null, groupName, physicsPath + fileName);
var physicsPath1 = physicsPath + fileName;
//if (dataSourceLists.Any())
// physicsPath1 = physicsPath + path + newFileName;
return ServiceResult<string>.OprateSuccess(groupName + "_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
}
}

@ -6,11 +6,13 @@
public class Ghrh_ResumeEduBGServices : BaseServices<Ghrh_ResumeEduBG, Ghrh_ResumeEduBGDto, InsertGhrh_ResumeEduBGInput, EditGhrh_ResumeEduBGInput>, IGhrh_ResumeEduBGServices
{
private readonly IBaseRepository<Ghrh_ResumeEduBG> _dal;
public Ghrh_ResumeEduBGServices(ICaching caching, IBaseRepository<Ghrh_ResumeEduBG> dal)
private readonly ICommonServices _commonServices;
public Ghrh_ResumeEduBGServices(ICaching caching, IBaseRepository<Ghrh_ResumeEduBG> dal, ICommonServices commonServices)
{
this._dal = dal;
base.BaseDal = dal;
base._caching = caching;
_commonServices = commonServices;
}
public override async Task<List<Ghrh_ResumeEduBGDto>> QueryDto(Expression<Func<Ghrh_ResumeEduBG, bool>> whereExpression)
@ -95,62 +97,11 @@ public class Ghrh_ResumeEduBGServices : BaseServices<Ghrh_ResumeEduBG, Ghrh_Resu
}
public async Task<List<ResumeFormColumn1>> QueryResumeFormColumn(long resumeTemplateID = 0)
{
resumeTemplateID = await Db.Ado.GetLongAsync("select top 1 Id from Ghrh_ResumeTemplate where IsEnable=1 and IsPublish=1");
var sql = @$"DECLARE @ResumeTemplateID BIGINT = {resumeTemplateID}
SELECT A.ColumnName, A.ResumeInfoColumnName ColumnNameDesc, D.GroupType, A.MapTableName, A.MapColumnName,
A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSourceID
FROM Ghrh_ResumeInfoColumn A
LEFT JOIN Ghrh_ResumeTemplateInfoGroupColumn B
ON B.ResumeInfoColumnID = A.ID
AND B.IsDisplay = 1
AND B.IsEnable = 1
AND A.IsEnable = 1
JOIN Ghrh_ResumeTemplateInfoGroup C
ON B.ResumeTemplateInfoGroupID = C.Id
JOIN Ghrh_ResumeInfoGroup D
ON C.ResumeInfoGroupId = D.ID AND D.IsEnable = 1
WHERE C.ResumeTemplateID = @ResumeTemplateID
AND D.GroupType = 'Education' and b.StaffInfoColumnNo !='AttachmentIDs'
ORDER BY D.GroupType, b.SortNo";
return await Db.Ado.SqlQueryAsync<ResumeFormColumn1>(sql);
}
#region Excel导入
public override async Task<ServiceResult<string>> DownloadExcel(string menuName)
{
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
Type entityType = typeof(Ghre_Teacher);
DataTable dt = new DataTable("TempTable");
var formColumns = await QueryResumeFormColumn();
string fileName = path + SnowFlakeSingle.instance.getID() + ".xlsx";
dt.Columns.Add("姓名", typeof(string));
formColumns
.ToList()
.ForEach(x =>
{
if (!dt.Columns.Contains(x.ColumnNameDesc))
dt.Columns.Add(x.ColumnNameDesc, typeof(string));
});
var dr = dt.NewRow();
dt.Rows.Add(dr);
NPOIHelper.ExportExcel(dt, null, "教育背景", physicsPath + fileName);
var physicsPath1 = physicsPath + fileName;
//if (dataSourceLists.Any())
// physicsPath1 = physicsPath + path + newFileName;
var result = ServiceResult<string>.OprateSuccess("教育背景_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
return result;
return await ExtensionHelper.GenerateReumeArchivesImportTemplate(Db, "Education", "教育背景");
}
public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file, string menuName = null, long? MasterId = null)
{
@ -176,7 +127,7 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
if (dt.Columns["Comments"] == null)
dt.Columns.Add("Comments", typeof(string));
var formColumns = await QueryResumeFormColumn();
var formColumns = await ExtensionHelper.QueryResumeFormColumn(Db, "Education");
for (int i = 0; i < dt.Rows.Count; i++)
{

@ -93,58 +93,9 @@ public class Ghrh_ResumeHomeServices : BaseServices<Ghrh_ResumeHome, Ghrh_Resume
#region Excel导入
public async Task<List<ResumeFormColumn1>> QueryResumeFormColumn(long resumeTemplateID = 0)
{
resumeTemplateID = await Db.Ado.GetLongAsync("select top 1 Id from Ghrh_ResumeTemplate where IsEnable=1 and IsPublish=1");
var sql = @$"DECLARE @ResumeTemplateID BIGINT = {resumeTemplateID}
SELECT A.ColumnName, A.ResumeInfoColumnName ColumnNameDesc, D.GroupType, A.MapTableName, A.MapColumnName,
A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSourceID
FROM Ghrh_ResumeInfoColumn A
LEFT JOIN Ghrh_ResumeTemplateInfoGroupColumn B
ON B.ResumeInfoColumnID = A.ID
AND B.IsDisplay = 1
AND B.IsEnable = 1
AND A.IsEnable = 1
JOIN Ghrh_ResumeTemplateInfoGroup C
ON B.ResumeTemplateInfoGroupID = C.Id
JOIN Ghrh_ResumeInfoGroup D
ON C.ResumeInfoGroupId = D.ID AND D.IsEnable = 1
WHERE C.ResumeTemplateID = @ResumeTemplateID
AND D.GroupType = 'Family' and b.StaffInfoColumnNo !='AttachmentIDs'
ORDER BY D.GroupType, b.SortNo";
return await Db.Ado.SqlQueryAsync<ResumeFormColumn1>(sql);
}
public override async Task<ServiceResult<string>> DownloadExcel(string menuName)
{
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
DataTable dt = new DataTable("TempTable");
var formColumns = await QueryResumeFormColumn();
string fileName = path + SnowFlakeSingle.instance.getID() + ".xlsx";
dt.Columns.Add("姓名", typeof(string));
formColumns
.ToList()
.ForEach(x =>
{
if (!dt.Columns.Contains(x.ColumnNameDesc))
dt.Columns.Add(x.ColumnNameDesc, typeof(string));
});
var dr = dt.NewRow();
dt.Rows.Add(dr);
NPOIHelper.ExportExcel(dt, null, "社会关系", physicsPath + fileName);
var physicsPath1 = physicsPath + fileName;
//if (dataSourceLists.Any())
// physicsPath1 = physicsPath + path + newFileName;
var result = ServiceResult<string>.OprateSuccess("社会关系_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
return result;
return await ExtensionHelper.GenerateReumeArchivesImportTemplate(Db, "Family", "社会关系");
}
public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file, string menuName = null, long? MasterId = null)
{
@ -170,8 +121,8 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
if (dt.Columns["Comments"] == null)
dt.Columns.Add("Comments", typeof(string));
var formColumns = await QueryResumeFormColumn();
var formColumns = await ExtensionHelper.QueryResumeFormColumn(Db, "Family");
for (int i = 0; i < dt.Rows.Count; i++)
{
var comments = new List<string>();
@ -184,9 +135,9 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
{ "CreateTime", DateTime.Now },
{ "UpdateTime", DateTime.Now }
};
if (!dt.Columns.Contains("姓名"))
if (!dt.Columns.Contains("简历姓名"))
{
comments.Add("未查询到【姓名】列!");
comments.Add("未查询到【简历姓名】列!");
data.ErrorCount++;
dt.Rows[i]["Comments"] = string.Join(";", comments.Select(a => a));
isExistError = true;
@ -297,7 +248,7 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
}
var StaffName = dt.Rows[i]["姓名"].ToString();
var StaffName = dt.Rows[i]["简历姓名"].ToString();
var resume = await Db.Queryable<Ghrh_Resume>().Where(x => x.StaffName == StaffName || x.StaffEname == StaffName).FirstAsync();
if (resume is null)

@ -89,59 +89,9 @@ public class Ghrh_ResumeLicenceServices : BaseServices<Ghrh_ResumeLicence, Ghrh_
}
#endregion
#region Excel导入
public async Task<List<ResumeFormColumn1>> QueryResumeFormColumn(long resumeTemplateID = 0)
{
resumeTemplateID = await Db.Ado.GetLongAsync("select top 1 Id from Ghrh_ResumeTemplate where IsEnable=1 and IsPublish=1");
var sql = @$"DECLARE @ResumeTemplateID BIGINT = {resumeTemplateID}
SELECT A.ColumnName, A.ResumeInfoColumnName ColumnNameDesc, D.GroupType, A.MapTableName, A.MapColumnName,
A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSourceID
FROM Ghrh_ResumeInfoColumn A
LEFT JOIN Ghrh_ResumeTemplateInfoGroupColumn B
ON B.ResumeInfoColumnID = A.ID
AND B.IsDisplay = 1
AND B.IsEnable = 1
AND A.IsEnable = 1
JOIN Ghrh_ResumeTemplateInfoGroup C
ON B.ResumeTemplateInfoGroupID = C.Id
JOIN Ghrh_ResumeInfoGroup D
ON C.ResumeInfoGroupId = D.ID AND D.IsEnable = 1
WHERE C.ResumeTemplateID = @ResumeTemplateID
AND D.GroupType = 'Licence' and b.StaffInfoColumnNo !='AttachmentIDs'
ORDER BY D.GroupType, b.SortNo";
return await Db.Ado.SqlQueryAsync<ResumeFormColumn1>(sql);
}
public override async Task<ServiceResult<string>> DownloadExcel(string menuName)
{
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
DataTable dt = new DataTable("TempTable");
var formColumns = await QueryResumeFormColumn();
string fileName = path + SnowFlakeSingle.instance.getID() + ".xlsx";
dt.Columns.Add("姓名", typeof(string));
formColumns
.ToList()
.ForEach(x =>
{
if (!dt.Columns.Contains(x.ColumnNameDesc))
dt.Columns.Add(x.ColumnNameDesc, typeof(string));
});
var dr = dt.NewRow();
dt.Rows.Add(dr);
NPOIHelper.ExportExcel(dt, null, "证件", physicsPath + fileName);
var physicsPath1 = physicsPath + fileName;
//if (dataSourceLists.Any())
// physicsPath1 = physicsPath + path + newFileName;
var result = ServiceResult<string>.OprateSuccess("证件_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
return result;
return await ExtensionHelper.GenerateReumeArchivesImportTemplate(Db, "Licence", "证件");
}
public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file, string menuName = null, long? MasterId = null)
{
@ -167,7 +117,7 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
if (dt.Columns["Comments"] == null)
dt.Columns.Add("Comments", typeof(string));
var formColumns = await QueryResumeFormColumn();
var formColumns = await ExtensionHelper.QueryResumeFormColumn(Db, "Licence");
for (int i = 0; i < dt.Rows.Count; i++)
{

@ -90,61 +90,12 @@ public class Ghrh_ResumeTrainingServices : BaseServices<Ghrh_ResumeTraining, Ghr
}
return result;
}
#region Excel导入
public async Task<List<ResumeFormColumn1>> QueryResumeFormColumn(long resumeTemplateID = 0)
{
resumeTemplateID = await Db.Ado.GetLongAsync("select top 1 Id from Ghrh_ResumeTemplate where IsEnable=1 and IsPublish=1");
var sql = @$"DECLARE @ResumeTemplateID BIGINT = {resumeTemplateID}
SELECT A.ColumnName, A.ResumeInfoColumnName ColumnNameDesc, D.GroupType, A.MapTableName, A.MapColumnName,
A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSourceID
FROM Ghrh_ResumeInfoColumn A
LEFT JOIN Ghrh_ResumeTemplateInfoGroupColumn B
ON B.ResumeInfoColumnID = A.ID
AND B.IsDisplay = 1
AND B.IsEnable = 1
AND A.IsEnable = 1
JOIN Ghrh_ResumeTemplateInfoGroup C
ON B.ResumeTemplateInfoGroupID = C.Id
JOIN Ghrh_ResumeInfoGroup D
ON C.ResumeInfoGroupId = D.ID AND D.IsEnable = 1
WHERE C.ResumeTemplateID = @ResumeTemplateID
AND D.GroupType = 'Training' and b.StaffInfoColumnNo !='AttachmentIDs'
ORDER BY D.GroupType, b.SortNo";
return await Db.Ado.SqlQueryAsync<ResumeFormColumn1>(sql);
}
#region Excel导入
public override async Task<ServiceResult<string>> DownloadExcel(string menuName)
{
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
DataTable dt = new DataTable("TempTable");
var formColumns = await QueryResumeFormColumn();
string fileName = path + SnowFlakeSingle.instance.getID() + ".xlsx";
dt.Columns.Add("姓名", typeof(string));
formColumns
.ToList()
.ForEach(x =>
{
if (!dt.Columns.Contains(x.ColumnNameDesc))
dt.Columns.Add(x.ColumnNameDesc, typeof(string));
});
return await ExtensionHelper.GenerateReumeArchivesImportTemplate(Db, "Training", "培训记录");
var dr = dt.NewRow();
dt.Rows.Add(dr);
NPOIHelper.ExportExcel(dt, null, "培训记录", physicsPath + fileName);
var physicsPath1 = physicsPath + fileName;
//if (dataSourceLists.Any())
// physicsPath1 = physicsPath + path + newFileName;
var result = ServiceResult<string>.OprateSuccess("培训记录_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
return result;
}
public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file, string menuName = null, long? MasterId = null)
{
@ -169,8 +120,7 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
var dt = NPOIHelper.ImportExcel(filepath, "培训记录");
if (dt.Columns["Comments"] == null)
dt.Columns.Add("Comments", typeof(string));
var formColumns = await QueryResumeFormColumn();
var formColumns = await ExtensionHelper.QueryResumeFormColumn(Db, "Training");
for (int i = 0; i < dt.Rows.Count; i++)
{
@ -220,7 +170,7 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
isExistError = true;
continue;
}
if (column.DataSourceType.IsNullOrEmpty())
if (column.DataType.IsNullOrEmpty())
{
if (column.DataType == "int" || column.DataType == "decimal")
{

@ -90,60 +90,10 @@ public class Ghrh_ResumeWorkExpServices : BaseServices<Ghrh_ResumeWorkExp, Ghrh_
}
#endregion
#region Excel导入
public async Task<List<ResumeFormColumn1>> QueryResumeFormColumn(long resumeTemplateID = 0)
{
resumeTemplateID = await Db.Ado.GetLongAsync("select top 1 Id from Ghrh_ResumeTemplate where IsEnable=1 and IsPublish=1");
var sql = @$"DECLARE @ResumeTemplateID BIGINT = {resumeTemplateID}
SELECT A.ColumnName, A.ResumeInfoColumnName ColumnNameDesc, D.GroupType, A.MapTableName, A.MapColumnName,
A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSourceID
FROM Ghrh_ResumeInfoColumn A
LEFT JOIN Ghrh_ResumeTemplateInfoGroupColumn B
ON B.ResumeInfoColumnID = A.ID
AND B.IsDisplay = 1
AND B.IsEnable = 1
AND A.IsEnable = 1
JOIN Ghrh_ResumeTemplateInfoGroup C
ON B.ResumeTemplateInfoGroupID = C.Id
JOIN Ghrh_ResumeInfoGroup D
ON C.ResumeInfoGroupId = D.ID AND D.IsEnable = 1
WHERE C.ResumeTemplateID = @ResumeTemplateID
AND D.GroupType = 'WorkExp' and b.StaffInfoColumnNo !='AttachmentIDs'
ORDER BY D.GroupType, b.SortNo";
return await Db.Ado.SqlQueryAsync<ResumeFormColumn1>(sql);
}
#region Excel导入
public override async Task<ServiceResult<string>> DownloadExcel(string menuName)
{
var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot";
var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}ExcelTemplate{Path.DirectorySeparatorChar}"}";
if (!Directory.Exists(physicsPath + path))
Directory.CreateDirectory(physicsPath + path);
DataTable dt = new DataTable("TempTable");
var formColumns = await QueryResumeFormColumn();
string fileName = path + SnowFlakeSingle.instance.getID() + ".xlsx";
dt.Columns.Add("姓名", typeof(string));
formColumns
.ToList()
.ForEach(x =>
{
if (!dt.Columns.Contains(x.ColumnNameDesc))
dt.Columns.Add(x.ColumnNameDesc, typeof(string));
});
var dr = dt.NewRow();
dt.Rows.Add(dr);
NPOIHelper.ExportExcel(dt, null, "工作经历", physicsPath + fileName);
var physicsPath1 = physicsPath + fileName;
//if (dataSourceLists.Any())
// physicsPath1 = physicsPath + path + newFileName;
var result = ServiceResult<string>.OprateSuccess("工作经历_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now) + ".xlsx", physicsPath1);
return result;
return await ExtensionHelper.GenerateReumeArchivesImportTemplate(Db, "WorkExp", "工作经历");
}
public override async Task<ServiceResult<ExcelData>> ImportExcel(IFormFile file, string menuName = null, long? MasterId = null)
{
@ -169,8 +119,8 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo
if (dt.Columns["Comments"] == null)
dt.Columns.Add("Comments", typeof(string));
var formColumns = await QueryResumeFormColumn();
var formColumns = await ExtensionHelper.QueryResumeFormColumn(Db, "WorkExp");
for (int i = 0; i < dt.Rows.Count; i++)
{
var comments = new List<string>();

Loading…
Cancel
Save