核心代码:
#region 打包下载
/// <summary>
/// 淘宝数据包下载,生成csv格式。可直接通过淘宝助理上传到淘宝店铺
/// </summary>
/// <param name="ids">传入的参数产品ID格式:1-2-3-4</param>
/// <returns></returns>
[HttpGet]
public ActionResult GetZip_Products(string ids)
{
//string host = Request.UrlReferrer.Authority;
if (String.IsNullOrEmpty(ids)) return null;
List<int> idList = ids.Split('-').Select(s => int.Parse(s)).ToList();
OperationResult result = ProductService.GetZip_Products(idList);
var list = result.AppendData as List<ProductInfo>;
string ProName = "";
#region 拼接淘宝属性
//根据自己需要创建列头
DataTable dt = new DataTable();
dt.Columns.Add("title");//宝贝名称
dt.Columns.Add("cid");//宝贝类目
dt.Columns.Add("num");//宝贝数量
dt.Columns.Add("cateProps");//宝贝属性
dt.Columns.Add("skuProps");//销售属性组合
dt.Columns.Add("price");//价格
dt.Columns.Add("description");//描述
dt.Columns.Add("picture");//图片
foreach (var info in list)
{
ProName = info.txtTitle;
//获取单条产品信息
OperationResult proResult = ProductService.Pro_GetInfo(info.ID);
ProductInfo pInfo = proResult.AppendData as ProductInfo;
DataRow dr = dt.NewRow();
dr["title"] = info.txtTitle;
#region 宝贝数量
int temp_num = 0;
foreach (var item in pInfo.hidStockPropertyList)
{
temp_num += (item.num ?? 0);
}
dr["num"] = temp_num;
#endregion
#region 宝贝类目
dr["cid"] = ProductService.GetCid_Info((pInfo.hidAttrStencilID ?? 0));
#endregion
#region 宝贝属性
string temp = string.Empty;
List<TreeGrid> tg = pInfo.hidAttrStencilTable;
foreach (var item in tg)
{
if (item.inputtype.Equals(2))
{
string Vid = ProductService.GetVid_Info(item.value, item.id);
if (!string.IsNullOrEmpty(Vid))
{
temp += item.pid + ":" + Vid + ";";
}
}
}
if (!string.IsNullOrEmpty(temp))
{
dr["cateProps"] = temp.Substring(0, temp.Length - 1);
}
else
{
dr["cateProps"] = "";
}
#endregion
#region 销售属性组合
dr["skuProps"] = AttrService.Get_Salesproperty(pInfo.hidStockPropertyList);
#endregion
#region 宝贝价格
dr["price"] = info.txtUnitPrice;
#endregion
#region 宝贝描述
dr["description"] = info.txtContentText;
#endregion
#region 宝贝图片
#region 图片集合
string temp_img = string.Empty;
int temp_id = 0;
foreach (var itemimg in info.hidImgList)
{
//"2014102916324489933916.jpg"
string imgurl = itemimg.LFilePath.Substring(itemimg.LFilePath.LastIndexOf("/") + 1).Split('.')[0];
temp_img += imgurl + ":1:" + temp_id + ":|;";
temp_id++;
}
#endregion
dr["picture"] = temp_img;
#endregion
//dr["picture"] = string.Join("|", info.hidImgList.Select(s => s.LFilePath.Substring(s.LFilePath.LastIndexOf("/") + 1)));
dt.Rows.Add(dr);
}
#endregion
if (list != null)
{
#region 保存路径设置
//路径可自己进行设置,我这里直接取的配置文件里面的路径
//读取配置文件中的信息
var config = WebConfigs.GetConfig();
string newGuidFile = Guid.NewGuid().ToString();
String _SavePath = config.SavePath;
String _Folder = CommonEnum.ProductImg_Remote;
if (!_Folder.EndsWith("/")) _Folder += "/";
String _FolderGzip = CommonEnum.ProductImg_LocalGzip;
if (!_FolderGzip.EndsWith("/")) _FolderGzip += "/";
String _SavePathRemote = _SavePath + _Folder;
String _SavePathLocalGzip = _SavePath + _Folder + newGuidFile + "/";
//创建相关文件夹
Utils.CreateDir(Server.MapPath(_SavePathRemote));
Utils.CreateDir(Server.MapPath(_SavePathLocalGzip));
Utils.CreateDir(Server.MapPath(_SavePathLocalGzip + "/" + ProName + "/"));
int rowIndex = 3;
#endregion
foreach (var Item in list)
{
#region MyRegion
string itemPath = _SavePathLocalGzip + "/" + ProName + "/";
foreach (var imgItem in Item.hidImgList)
{
GetContent(imgItem.LFilePath, newGuidFile, _SavePath, itemPath);
}
rowIndex++;
#endregion
}
String execlPath = _SavePathLocalGzip + ProName + ".csv";
FileStream fs = new FileStream(Server.MapPath(execlPath), System.IO.FileMode.Create, System.IO.FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("GB2312"));
string data = "version 1.00";
sw.WriteLine(data);
data = "";
//写出列名称
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
sw.WriteLine("宝贝名称,宝贝类目,宝贝数量,宝贝属性,销售属性组合,宝贝价格,宝贝描述,新图片");
//写出各行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
data = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
string str = dt.Rows[i][j].ToString();
str = str.Replace("\"", "\"\"");//替换英文冒号 英文冒号需要换成两个冒号
if (str.Contains(',') || str.Contains('"')
|| str.Contains('\r') || str.Contains('\n')) //含逗号 冒号 换行符的需要放到引号中
{
str = string.Format("\"{0}\"", str);
}
data += str;
if (j < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
string ZipFile = Server.MapPath(_SavePathRemote + newGuidFile + ".zip");
//压缩
CompressionHelper.CreateZip(Server.MapPath(_SavePathLocalGzip), ZipFile);
return File(ZipFile, "application/zip", newGuidFile + ".zip");
}
return null;
}
/// <summary>
/// 将DataTable中数据写入到CSV文件中
/// </summary>
/// <param name="dt">提供保存数据的DataTable</param>
/// <param name="fileName">CSV的文件路径</param>
public static void SaveCSV(DataTable dt, string fullPath)
{
FileInfo fi = new FileInfo(fullPath);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
FileStream fs = new FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
//StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
string data = "";
//写出列名称
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
//写出各行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
data = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
string str = dt.Rows[i][j].ToString();
str = str.Replace("\"", "\"\"");//替换英文冒号 英文冒号需要换成两个冒号
if (str.Contains(',') || str.Contains('"')
|| str.Contains('\r') || str.Contains('\n')) //含逗号 冒号 换行符的需要放到引号中
{
str = string.Format("\"{0}\"", str);
}
data += str;
if (j < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
}
#endregion
调用到的方法:
#region 处理远程图片及移动文件到指定目录
private bool GetContent(string ContentText, string newGuidFile, string _SavePath, string _SavePathLocalGzip)
{
if (string.IsNullOrEmpty(ContentText)) return false;
MatchCollection mc = Regex.Matches(ContentText, "http://.[^'|\\s|\"]*\\.(jpg|gif|png|bmp|jpeg|JPG|GIF|PNG|BMP|JPEG)");
if (mc != null && mc.Count > 0)
{
foreach (Match Item in mc)
{
if (string.IsNullOrEmpty(Item.Value) || Item.Value.Length < 4) continue;
String fileExt = Item.Value.Substring(Item.Value.LastIndexOf('.'));
String newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
//生成新路径
String filePath = _SavePath + newFileName;
String filePathLocal = _SavePathLocalGzip + newFileName;
while (System.IO.File.Exists(Server.MapPath(filePath)))
{
newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
filePath = _SavePath + newFileName;
filePathLocal = _SavePathLocalGzip + newFileName;
}
bool IsSave = SaveRemoteImg(Item.Value, Server.MapPath(filePath));
if (IsSave && System.IO.File.Exists(Server.MapPath(filePath)))
{
System.IO.File.Copy(Server.MapPath(filePath), Server.MapPath(filePathLocal));
return true;
}
return false;
}
}
else
{
String fileName = ContentText.Substring(ContentText.LastIndexOf("/") + 1);
String filePathLocal = _SavePathLocalGzip + fileName;
if (System.IO.File.Exists(Server.MapPath(ContentText)))
{
string s = ".tbi";
StringBuilder strF = new StringBuilder();
strF.Append(fileName.Substring(fileName.LastIndexOf("/") + 1).Split('.')[0]).Append(s);
System.IO.File.Copy(Server.MapPath(ContentText), Server.MapPath(_SavePathLocalGzip + strF));
}
return true;
}
return false;
}
/// 保存远程图片
/// </summary>
/// <param name="filePath">远程图片路径</param>
/// <param name="SavePath">服务器端保存路径</param>
/// <returns></returns>
private bool SaveRemoteImg(string filePath, string SavePath)
{
System.Drawing.Image image = null;
try
{
System.Net.HttpWebRequest webrequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(filePath);
System.Net.HttpWebResponse webresponse = (System.Net.HttpWebResponse)webrequest.GetResponse();
if (webresponse.StatusCode == System.Net.HttpStatusCode.OK)
{
image = System.Drawing.Image.FromStream(webresponse.GetResponseStream());
//保存在服务器的本地硬盘
image.Save(SavePath);
return true;
}
return false;
}
catch (Exception ex)
{
LogHelper.WriteErrorLog("远程图片保存失败", ex);
return false;
}
finally
{
if (image != null)
{
image.Dispose(); //释放资源
}
}
}
生成文件的最后效果图:
<img src="https://img-blog.csdn.net/20150917110008362?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20150917110056200?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />