/// 测试导出excel代码 private void TestExcelExport() { var homePageNode = HtmlCacheParser.LoadHtmlNode("http://www.bavc.com.cn/c44167.htm"); // 内容页 /html/body/table[4]/tbody/tr/td[3]/p[3]/table[1] var mainContent = homePageNode.SelectSingleNode("/html/body/table[4]/tbody/tr/td[3]/table[3]"); List <string> urls = new List <string>(); foreach (var link in mainContent.SelectNodes(".//a")) { var navPath = link.Attributes["href"].Value; var title = link.InnerText; var address = "http://www.bavc.com.cn" + navPath; urls.Add(address); System.Console.WriteLine($"{title}, {address}"); } ExcelSheetModel model = new ExcelSheetModel { Name = "test", MediaItems = urls.Select(x => new MediaItem { Title = x }).ToList() }; ExcelHelper.Save("test.xlsx", new ExcelSheetModel[] { model }); return; }
private static void WriteToDoc(XWPFDocument doc, ExcelSheetModel item) { var p1 = doc.CreateParagraph(); p1.Style = "Heading1"; p1.Alignment = ParagraphAlignment.CENTER; XWPFRun r1 = p1.CreateRun(); // r1.FontSize = 16; // r1.IsBold = true; r1.SetText(item.Name); foreach (var media in item.MediaItems) { WriteMedia(doc, media); } }
private static void WriteToSheet(IWorkbook workbook, ExcelSheetModel sheetModel) { System.Console.WriteLine(sheetModel.Name); ISheet sheet = workbook.CreateSheet(sheetModel.Name); // titleRow WriteToCell(sheet, 0, 0, "名称", HSSFColor.LightBlue.Index); WriteToCell(sheet, 0, 1, "Url"); WriteToCell(sheet, 0, 2, "发布时间"); WriteToCell(sheet, 0, 3, "简介"); WriteToCell(sheet, 0, 4, "封面图片地址"); WriteToCell(sheet, 0, 5, "音频名称"); WriteToCell(sheet, 0, 6, "音频信息名称"); WriteToCell(sheet, 0, 7, "歌词标题", HSSFColor.LightGreen.Index); WriteToCell(sheet, 0, 8, "歌词", HSSFColor.LightGreen.Index); WriteToCell(sheet, 0, 9, "mp3地址", HSSFColor.LightGreen.Index); WriteToCell(sheet, 0, 10, "mp4地址", HSSFColor.LightGreen.Index); WriteToCell(sheet, 0, 11, "Artists", HSSFColor.LightGreen.Index); int dataRowIndex = 1; foreach (var mediaItem in sheetModel.MediaItems) { System.Console.WriteLine($"\t{mediaItem.Title}"); WriteToCell(sheet, dataRowIndex, 0, mediaItem.Title); WriteToCell(sheet, dataRowIndex, 1, mediaItem.Url); WriteToCell(sheet, dataRowIndex, 2, mediaItem.PublishTime); WriteToCell(sheet, dataRowIndex, 3, mediaItem.Description); WriteToCell(sheet, dataRowIndex, 4, mediaItem.ImageUrl); // 每个专辑的音频内容 var itemCount = 0; foreach (var mp3Item in mediaItem.Mp3Items) { // 给当前专辑前面的空格画边框 if (itemCount++ > 0) { for (int i = 0; i < 5; i++) { WriteToCell(sheet, dataRowIndex, i, null); } } WriteToCell(sheet, dataRowIndex, 5, mp3Item.Title); WriteToCell(sheet, dataRowIndex, 6, mp3Item.Url); WriteToCell(sheet, dataRowIndex, 7, mp3Item.LyricTitle); WriteToCell(sheet, dataRowIndex, 8, mp3Item.Lyric); WriteToCell(sheet, dataRowIndex, 9, !string.IsNullOrEmpty(mp3Item.Mp3DownloadUrl) ? mp3Item.Mp3DownloadUrl : "无"); WriteToCell(sheet, dataRowIndex, 10, !string.IsNullOrEmpty(mp3Item.Mp4DownloadUrl) ? mp3Item.Mp4DownloadUrl : "无"); // MP3艺术家(album artists 标签) var artistIndex = 11; foreach (var artist in mp3Item.GuessArtists(mediaItem.Title, out _)) { WriteToCell(sheet, dataRowIndex, artistIndex, artist); ++artistIndex; } // next line ++dataRowIndex; } // next line ++dataRowIndex; } int[] autoWidthCols = new int[] { 0, 2, 5, 9 }; foreach (var i in autoWidthCols) { // sheet.AutoSizeColumn(i); sheet.SetColumnWidth(i, 256 * 30); } }
static void Main(string[] args) { //var url2 = "http://www.bavc.com.cn/w10279097.htm?page=1"; HtmlParseLogger.TagError("tag 错误"); Uri uri = new Uri("http://mpv.videocc.net/d69fff2eae/c/d69fff2eaef75ebc9d69ae4e5f3a891c_1.mp4?pid=1578623766586X1882197"); var query = uri.Query; var index = uri.OriginalString.IndexOf(query); var newUrl = uri.OriginalString.Substring(0, index); System.Console.WriteLine(uri.OriginalString); System.Console.WriteLine(newUrl); HtmlParseLogger.Info("Start..."); #region 从缓存文件 或 解析html读取信息 // 要下载的目录 Dictionary <string, string> downloadItems = new Dictionary <string, string> { { "2018年出品-京剧", "http://www.bavc.com.cn/c44167.htm" }, { "2018年出品-老北京曲艺", "http://www.bavc.com.cn/c44168.htm" }, { "2018年出品-评剧", "http://www.bavc.com.cn/c44169.htm" }, { "2019年出品-京剧", "http://www.bavc.com.cn/c44417.htm" }, { "2019年出品-曲艺", "http://www.bavc.com.cn/c44418.htm" }, }; // 转换为model List <ExcelSheetModel> sheetModels = null; if (System.IO.File.Exists(_CACHE_JSON_FILE)) { try { var jsonStr = System.IO.File.ReadAllText(_CACHE_JSON_FILE); sheetModels = Newtonsoft.Json.JsonConvert.DeserializeObject <List <ExcelSheetModel> >(jsonStr); System.Console.WriteLine($"从缓存文件{_CACHE_JSON_FILE}中读取记录成功"); } catch (System.Exception ex) { System.Console.WriteLine(ex.Message); sheetModels = null; } } // 解析html if (sheetModels == null) { sheetModels = new List <ExcelSheetModel>(); // 缓存html然后 foreach (var item in downloadItems) { var url = item.Value; if (string.IsNullOrEmpty(url)) { continue; } ExcelSheetModel model = new ExcelSheetModel(); model.Name = item.Key; model.MediaItems = ParseMediaItems(url); sheetModels.Add(model); } // cache System.Console.WriteLine($"缓存文件{_CACHE_JSON_FILE}"); System.IO.File.WriteAllText( _CACHE_JSON_FILE, Newtonsoft.Json.JsonConvert.SerializeObject(sheetModels) ); System.IO.File.WriteAllText( System.IO.Path.GetFileNameWithoutExtension(_CACHE_JSON_FILE) + ".formatted" + System.IO.Path.GetExtension(_CACHE_JSON_FILE), Newtonsoft.Json.JsonConvert.SerializeObject(sheetModels, Newtonsoft.Json.Formatting.Indented) ); } #endregion #region 手动修改一些错误 // 根据文件名猜测artist时网页命名出现错误, 原文件名得到的是"林树森 华容道2 金少山" // "06 华容道2 林树森 金少山 胜利" 名称修改为 "06.华容道2 林树森 金少山 胜利" // 11 京剧红生大王《林树森专辑》 NormalizeMp3FileName(sheetModels, "06 华容道2 林树森 金少山 胜利", "06.华容道2 林树森 金少山 胜利"); // 2.京剧须生泰斗《马连良唱腔选》第一集 NormalizeMp3FileName(sheetModels, // 缺少 "马连良" "02.武家坡2 王玉蓉 百代", "02.武家坡2 马连良 王玉蓉 百代"); NormalizeMp3FileName(sheetModels, "03.武家坡3 王玉蓉 百代", "03.武家坡3 马连良 王玉蓉 百代"); NormalizeMp3FileName(sheetModels, "17.珠帘寨(沉静思)马连良 高亭", "17.珠帘寨(沉静思) 马连良 高亭"); // 12.京剧一枝独秀《管绍华唱腔选》第一集 NormalizeMp3FileName(sheetModels, "04.四郎探母5(坐宫) 王玉蓉 百代", "04.四郎探母9(坐宫) 管绍华 王玉蓉 百代"); NormalizeMp3FileName(sheetModels, "05.四郎探母5(坐宫) 王玉蓉 百代", "05.四郎探母5(坐宫) 管绍华 王玉蓉 百代"); NormalizeMp3FileName(sheetModels, "09. 四郎探母9(坐宫) 管绍华 王玉蓉 百代", "09.四郎探母9(坐宫) 管绍华 王玉蓉 百代"); // 23.京剧《著名小生专辑》 NormalizeMp3FileName(sheetModels, "19.得意缘3 (说破)毛世来 江世玉 丽歌", "19.得意缘3(说破) 毛世来 江世玉 丽歌"); NormalizeMp3FileName(sheetModels, "20.得意缘4 (说破)毛世来 江世玉 丽歌", "20.得意缘4(说破) 毛世来 江世玉 丽歌"); // 2.老北京曲艺大观《鼓界大王刘宝全》 第二集 NormalizeMp3FileName(sheetModels, "09 博望坡1 刘宝全蓓开", "09 博望坡1 刘宝全 蓓开"); NormalizeMp3FileName(sheetModels, "1-05.大保国-1言菊朋 百代", "1-05.大保国-1 言菊朋 百代"); NormalizeMp3FileName(sheetModels, "1-07.卖马-1言菊朋、焦宝奎 百代", "1-07.卖马-1 言菊朋 焦宝奎 百代"); NormalizeMp3FileName(sheetModels, "1-08.卖马-2言菊朋、焦宝奎 百代", "1-08.卖马-2 言菊朋 焦宝奎 百代"); // NormalizeMp3FileName(sheetModels, // "1-15.全部让徐州-1 言菊朋、马连昆 百代", // "1-15.全部让徐州-1 言菊朋 马连昆 百代"); // NormalizeMp3FileName(sheetModels, // "1-16.全部让徐州-2 言菊朋、马连昆 百代", // "1-16.全部让徐州-2 言菊朋 马连昆 百代"); NormalizeMp3FileName(sheetModels, "1-17.黄鹤楼 言菊朋.吴彦衡.王又荃 百代", "1-17.黄鹤楼 言菊朋 吴彦衡 王又荃 百代"); // NormalizeMp3FileName(sheetModels, // "1-18.阳平关 言菊朋、吴彦衡 百代", // "1-18.阳平关 言菊朋 吴彦衡 百代"); NormalizeMp3FileName(sheetModels, // 格式统一 "2-05 战北原-1 言菊朋 蓓开", "2-05.战北原-1 言菊朋 蓓开"); NormalizeMp3FileName(sheetModels, "2-06 战北原-2 言菊朋 蓓开", "2-06.战北原-2 言菊朋 蓓开"); NormalizeMp3FileName(sheetModels, "3-01.捉放宿店-1 胜利", "3-01.捉放宿店-1 言菊朋 胜利"); NormalizeMp3FileName(sheetModels, "3-02.捉放宿店-2 胜利", "3-02.捉放宿店-2 言菊朋 胜利"); // NormalizeMp3FileName(sheetModels, // "3-05.打渔杀家-1 言菊朋、云艳霞 胜利", // "3-05.打渔杀家-1 言菊朋 云艳霞 胜利"); // NormalizeMp3FileName(sheetModels, // "3-06.打渔杀家-2 言菊朋、云艳霞 胜利", // "3-06.打渔杀家-2 言菊朋 云艳霞 胜利"); // NormalizeMp3FileName(sheetModels, // "3-07.梅龙镇-1 言菊朋、云艳霞 胜利", // "3-07.梅龙镇-1 言菊朋 云艳霞 胜利"); // NormalizeMp3FileName(sheetModels, // "3-08.梅龙镇-2 言菊朋、云艳霞 胜利", // "3-08.梅龙镇-2 言菊朋 云艳霞 胜利"); // 4. 《周信芳唱腔选》 NormalizeMp3FileName(sheetModels, "01.徐策跑城-1周信芳 高亭", "01.徐策跑城-1 周信芳 高亭"); // NormalizeMp3FileName(sheetModels, // "09.投军别窑-1 周信芳、潘雪艳 蓓开", // "09.投军别窑-1 周信芳 潘雪艳 蓓开"); // NormalizeMp3FileName(sheetModels, // "10.投军别窑-2 周信芳、潘雪艳 蓓开", // "10.投军别窑-2 周信芳 潘雪艳 蓓开"); // NormalizeMp3FileName(sheetModels, // "15.九更天-1 周信芳、贯盛习 蓓开", // "15.九更天-1 周信芳 贯盛习 蓓开"); // 5. 《徐碧云唱腔选》 // NormalizeMp3FileName(sheetModels, // "04.骊珠梦-2 徐碧云、言菊朋 蓓开", // "04.骊珠梦-2 徐碧云 言菊朋 蓓开"); // NormalizeMp3FileName(sheetModels, // "11.女起解-1 徐碧云、萧长华 高亭", // "11.女起解-1 徐碧云 萧长华 高亭"); // 6. 《郝寿臣唱腔选》 NormalizeMp3FileName(sheetModels, "05.除三害(打窑)-1郝寿臣 蓓开", "05.除三害(打窑)-1 郝寿臣 蓓开"); NormalizeMp3FileName(sheetModels, "06.除三害(打窑)-2郝寿臣 蓓开", "06.除三害(打窑)-2 郝寿臣 蓓开"); NormalizeMp3FileName(sheetModels, "08.鸿门宴-2郝寿臣 胜利", "08.鸿门宴-2 郝寿臣 胜利"); // NormalizeMp3FileName(sheetModels, // "13.白良关 郝寿臣、裘桂仙 百代", // ""); // NormalizeMp3FileName(sheetModels, // "14.洪羊洞 郝寿臣、裘桂仙 百代", // ""); // NormalizeMp3FileName(sheetModels, // "15.普球山-1 郝寿臣、萧长华 百代", // ""); // NormalizeMp3FileName(sheetModels, // "16.普球山-2 郝寿臣、萧长华 百代", // ""); // NormalizeMp3FileName(sheetModels, // "17.飞虎梦-1 郝寿臣、吴富琴 百代", // ""); // NormalizeMp3FileName(sheetModels, // "18.飞虎梦-2 郝寿臣、吴富琴 百代", // ""); // NormalizeMp3FileName(sheetModels, // "19.荆轲传-1 郝寿臣、甄洪奎 百代", // ""); // NormalizeMp3FileName(sheetModels, // "20.荆轲传-2 郝寿臣、甄洪奎 百代", // ""); // 7. 《裘桂仙唱腔选》 // NormalizeMp3FileName(sheetModels, // "02.黄金台-1 时慧宝、裘桂仙 百代", // ""); // NormalizeMp3FileName(sheetModels, // "03.黄金台-2 时慧宝、裘桂仙 百代", // ""); // NormalizeMp3FileName(sheetModels, // "12.骂曹 言菊朋、裘桂仙 开明", // ""); // NormalizeMp3FileName(sheetModels, // "13.二进宫 言菊朋、裘桂仙 开明", // ""); // 8. 《侯喜瑞、裘盛戎唱腔选》 // NormalizeMp3FileName(sheetModels, // "15.闹江州-1 金少山、裘盛戎 百代", // ""); // NormalizeMp3FileName(sheetModels, // "16.闹江州-2 金少山、裘盛戎 百代", // ""); // NormalizeMp3FileName(sheetModels, // "17.连环套-1 马德成、裘盛戎 国乐", // ""); // NormalizeMp3FileName(sheetModels, // "18.连环套-2 马德成、裘盛戎 国乐", // ""); // 9. 《萧长华唱腔选》 // NormalizeMp3FileName(sheetModels, // "03.八十八扯-1 马富禄、萧长华 胜利", // "03.八十八扯-1 马富禄、萧长华 胜利"); // NormalizeMp3FileName(sheetModels, // "04.八十八扯-2 马富禄、萧长华 胜利", // "04.八十八扯-2 马富禄、萧长华 胜利"); // NormalizeMp3FileName(sheetModels, // "05.八十八扯-3 马富禄、萧长华 胜利", // "05.八十八扯-3 马富禄、萧长华 胜利"); // NormalizeMp3FileName(sheetModels, // "06.八十八扯-4 马富禄、萧长华 胜利", // "06.八十八扯-4 马富禄、萧长华 胜利"); // NormalizeMp3FileName(sheetModels, // "07.打侄上坟-1 姜妙香、萧长华 胜利", // ""); // NormalizeMp3FileName(sheetModels, // "08.打侄上坟-2 姜妙香、萧长华 胜利", // "08.打侄上坟-2 姜妙香、萧长华 胜利"); // NormalizeMp3FileName(sheetModels, // "09.群英会-1 姜妙香、萧长华 胜利", // "09.群英会-1 姜妙香、萧长华 胜利"); // NormalizeMp3FileName(sheetModels, // "10.群英会-2 姜妙香、萧长华 胜利", // "10.群英会-2 姜妙香、萧长华 胜利"); // NormalizeMp3FileName(sheetModels, // "19.盘关-1 萧长华、萧盛萱 百代", // "19.盘关-1 萧长华、萧盛萱 百代"); // NormalizeMp3FileName(sheetModels, // "20.盘关-2 萧长华、萧盛萱 百代", // "20.盘关-2 萧长华 萧盛萱 百代"); NormalizeMp3FileName(sheetModels, "21.打杠子-1萧长华 太平", "21.打杠子-1 萧长华 太平"); // 10. 《汪派老生唱腔选》 NormalizeMp3FileName(sheetModels, "01.文昭关-1王凤卿 蓓开", "01.文昭关-1 王凤卿 蓓开"); NormalizeMp3FileName(sheetModels, "02.文昭关-2王凤卿 蓓开", "02.文昭关-2 王凤卿 蓓开"); NormalizeMp3FileName(sheetModels, "03.朱砂痣-1王凤卿 蓓开", "03.朱砂痣-1 王凤卿 蓓开"); NormalizeMp3FileName(sheetModels, "04.朱砂痣-2王凤卿 蓓开", "04.朱砂痣-2 王凤卿 蓓开"); NormalizeMp3FileName(sheetModels, "13.红拂传-1 郭仲衡、杜丽云 长城", "13.红拂传-1 郭仲衡 杜丽云 长城"); NormalizeMp3FileName(sheetModels, "15.举鼎观画-1郭仲衡 大中华", "15.举鼎观画-1 郭仲衡 大中华"); NormalizeMp3FileName(sheetModels, "16.举鼎观画-2郭仲衡 大中华", "16.举鼎观画-2 郭仲衡 大中华"); // 梨园名票唱腔选 NormalizeMp3FileName(sheetModels, "01.汾河湾-1顾珏荪、张吾翼 百乐", "01.汾河湾-1 顾珏荪、张吾翼 百乐"); // 2019年出品-曲艺 NormalizeMp3FileName(sheetModels, "4-06.北派坠子《吕蒙正赶斋》2 乔清秀乔利元 胜利", "4-06.北派坠子《吕蒙正赶斋》2 乔清秀 乔利元 胜利"); NormalizeMp3FileName(sheetModels, "4-07.北派坠子《马前泼水》1 乔清秀乔利元 胜利", "4-07.北派坠子《马前泼水》1 乔清秀 乔利元 胜利"); NormalizeMp3FileName(sheetModels, "4-08.北派坠子《马前泼水》2 乔清秀乔利元 胜利", "4-08.北派坠子《马前泼水》2 乔清秀 乔利元 胜利"); #endregion var result = sheetModels.ToArray(); // 导入没有MP3/MP4地址的记录 var errorFileName = System.IO.Path.Combine(StaticVariables.GetDownloadDir(), "errors.txt"); var errorCount = ExportHelper.ExportError(result, errorFileName); System.Console.WriteLine($"共找出{errorCount}个错误, log: {errorFileName}"); // // 导出excel总数据 //ExportHelper.ExportExcel("data.xlsx", result); // // 导出歌词 ExportHelper.ExportLyricToWord(result); // 下载封面图片,MP3 //ExportHelper.DownadMp3AndMp4(result); //return; // 生成MP3标签 //ExportHelper.GenerateTagInfo(result); }