将数据导入 SiteFinity
Import data into SiteFinity
SiteFinity 的新手。如何获取现有数据库(例如 CSV 或 excel 格式)并将项目导入 siteFinity 以在 SF 页面上进行交互?
我想将一个数据集作为产品,也许另一个数据集作为自定义内容类型。但是如何导入已经存在的数据呢?我应该使用 .Net 还是...?
我会创建一个 ServiceStack 服务(随 sitefinity 一起提供)来公开该 csv 数据,然后在任何地方使用它作为 Json... 如果意图是继续更新 CSV 作为主要数据源?我不确定这里的用例,你有一个外部系统可以转储到这个文件还是什么?
如果情况并非如此,您应该做的是使用 ModuleBuilder (/Sitefinity/Administration/Module-builder) 在 Sitefinity 中创建您的数据类型,然后 运行用于导入数据的脚本(您自己制作,MB 会根据您的结构为您提供示例导入代码)。
现在您可以更好地输入数据,并且可以通过 API\OData 端点正确公开所有内容(更不用说所有小部件都是自动生成的)。
首先您需要创建动态模块,包括项目的数据字段。然后你可以使用 .net 创建 api 或导入 CSV 的东西。
带有产品数据的示例代码,其中包含 No 和 Title 字段。
//read data from CSV
var attachedFile = System.Web.HttpContext.Current.Request.Files["CsvDoc"];
if (attachedFile == null || attachedFile.ContentLength <= 0) return Request.CreateResponse(HttpStatusCode.NoContent, "No data");
var csvReader = new StreamReader(attachedFile.InputStream);
string inputDataRead;
var values = new List<string>();
while ((inputDataRead = csvReader.ReadLine()) != null)
{
//values.Add(inputDataRead.Trim().Replace(" ", "").Replace(",", " "));
values.Add(inputDataRead);
}
values.Remove(values[0]);
//import to CMS
var dynamicModuleManager = DynamicModuleManager.GetManager();
var contentType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.Product.Product");
foreach (var value in values)
{
var eachValue = value.Split(',');
if (!string.IsNullOrEmpty(eachValue[0]))
{
using (new ElevatedModeRegion(dynamicModuleManager))
{
var newcontent = dynamicModuleManager.CreateDataItem(contentType);
newcontent.SetValue("No", eachValue[0] != "" ? eachValue[0] : string.Empty);
newcontent.SetValue("Title", eachValue[1] != "" ? eachValue[1] : string.Empty);
newcontent.UrlName = Regex.Replace(eachValue[1].ToLower(), @"[^\w\-\!$\'\(\)\=\@\d_]+", "-");;
newcontent.Author = "ImportCSV";
newcontent.SetWorkflowStatus(dynamicModuleManager.Provider.ApplicationName, "Published");
dynamicModuleManager.SaveChanges();
}
}
}
像这样的 CSV 文件:
否,标题
1,产品 1
2,产品 2
SiteFinity 的新手。如何获取现有数据库(例如 CSV 或 excel 格式)并将项目导入 siteFinity 以在 SF 页面上进行交互? 我想将一个数据集作为产品,也许另一个数据集作为自定义内容类型。但是如何导入已经存在的数据呢?我应该使用 .Net 还是...?
我会创建一个 ServiceStack 服务(随 sitefinity 一起提供)来公开该 csv 数据,然后在任何地方使用它作为 Json... 如果意图是继续更新 CSV 作为主要数据源?我不确定这里的用例,你有一个外部系统可以转储到这个文件还是什么?
如果情况并非如此,您应该做的是使用 ModuleBuilder (/Sitefinity/Administration/Module-builder) 在 Sitefinity 中创建您的数据类型,然后 运行用于导入数据的脚本(您自己制作,MB 会根据您的结构为您提供示例导入代码)。
现在您可以更好地输入数据,并且可以通过 API\OData 端点正确公开所有内容(更不用说所有小部件都是自动生成的)。
首先您需要创建动态模块,包括项目的数据字段。然后你可以使用 .net 创建 api 或导入 CSV 的东西。
带有产品数据的示例代码,其中包含 No 和 Title 字段。
//read data from CSV
var attachedFile = System.Web.HttpContext.Current.Request.Files["CsvDoc"];
if (attachedFile == null || attachedFile.ContentLength <= 0) return Request.CreateResponse(HttpStatusCode.NoContent, "No data");
var csvReader = new StreamReader(attachedFile.InputStream);
string inputDataRead;
var values = new List<string>();
while ((inputDataRead = csvReader.ReadLine()) != null)
{
//values.Add(inputDataRead.Trim().Replace(" ", "").Replace(",", " "));
values.Add(inputDataRead);
}
values.Remove(values[0]);
//import to CMS
var dynamicModuleManager = DynamicModuleManager.GetManager();
var contentType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.Product.Product");
foreach (var value in values)
{
var eachValue = value.Split(',');
if (!string.IsNullOrEmpty(eachValue[0]))
{
using (new ElevatedModeRegion(dynamicModuleManager))
{
var newcontent = dynamicModuleManager.CreateDataItem(contentType);
newcontent.SetValue("No", eachValue[0] != "" ? eachValue[0] : string.Empty);
newcontent.SetValue("Title", eachValue[1] != "" ? eachValue[1] : string.Empty);
newcontent.UrlName = Regex.Replace(eachValue[1].ToLower(), @"[^\w\-\!$\'\(\)\=\@\d_]+", "-");;
newcontent.Author = "ImportCSV";
newcontent.SetWorkflowStatus(dynamicModuleManager.Provider.ApplicationName, "Published");
dynamicModuleManager.SaveChanges();
}
}
}
像这样的 CSV 文件:
否,标题
1,产品 1
2,产品 2