我有一个目录'Folder',在这个目录中有很多子目录。在每个子目录中都有很多图像。我想循环遍历“Folder”目录中的子目录,然后循环遍历每个目录中的所有图像,将图像导出到Excel,并在一个Excel工作表中将每个子目录中的图像导出。
例如如果我有十个子目录,我应该有一个带有十个Excel工作表的Excel工作簿,然后在每个Excel工作表中将有来自每个子目录的图像。
这是我尝试过的,但图片只出现在Worksheet1而不是所有工作表上:
public void ExportToExcel()
{
//for export
ExcelPackage objExcelPackage = new ExcelPackage(); //create new workbook
string[] filesindirectory = Directory.GetDirectories(Server.MapPath("~/Folder"));
int count = 0;
int count1 = 0;
int x = 25;
int finalValue = 0;
foreach (string subdir in filesindirectory)
{
count++;
ExcelWorksheet ws = objExcelPackage.Workbook.Worksheets.Add("Worksheet" + count); //create new worksheet
foreach (string img in Directory.GetFiles(subdir))
{
count1++;
System.Web.UI.WebControls.Image TEST_IMAGE = new System.Web.UI.WebControls.Image();
System.Drawing.Image myImage = System.Drawing.Image.FromFile(img);
var pic = ws.Drawings.AddPicture(count1.ToString(), myImage);
// Row, RowoffsetPixel, Column, ColumnOffSetPixel
if (count1 > 1)
{
pic.SetPosition(finalValue, 0, 2, 0);
finalValue += (x + 1); // Add 1 to have 1 row of empty row
}
else
{
pic.SetPosition(count1, 0, 2, 0);
finalValue = (count1 + x) + 1; // Add 1 to have 1 row of empty
}
}
}
var filepath = new FileInfo(@"C:\Users\user\Desktop\Test\" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx");
objExcelPackage.SaveAs(filepath);
}
如何遍历目录中的每个子目录,然后使用C#循环遍历每个子目录中的所有图像?
答案 0 :(得分:8)
Janne Matikainen 答案是正确的,但您需要知道如何修改代码...
首先在此行更改您的代码
string[] filesindirectory = Directory.GetFiles(Server.MapPath("~/Folder"));
到
string[] filesindirectory = Directory.GetDirectories(Server.MapPath("~/Folder"));
其次,您需要在子文件夹路径中搜索文件
foreach (string subdir in filesindirectory)
subdir 是您目录的路径。
回答你为获取文件所做的相同的事情
foreach (string img in Directory.GetFiles(subdir))
完成foreach子目录后
foreach (string img in Directory.GetFiles(subdir))
{
// Your Code
}
// Reset the Count1
count1 = 0;
重置它,因为每个工作表的动态行生成都在增加
然后你在新表,你没有重置它。
它将按照前一张表继续计算。
要获取文件夹名称,您可以通过拆分轻松获取它。
在创建工作表之前,请按照以下步骤进行操作。
string[] splitter = subdir.Split('\\');
string folderName = splitter[splitter.Length - 1];
记下如果 folderName 包含某些符号,则可能无法将其设置为Excel工作表,且名称也不能太长。
请确保替换为excel工作表的可支持符号
答案 1 :(得分:4)
这应列出从C:\ Images开始的所有文件,并浏览所有子目录及其子目录。
public void ExportToExcel()
{
//for export
var objExcelPackage = new ExcelPackage(); //create new workbook
this.ListFiles(objExcelPackage, 0, Server.MapPath("~/Folder"));
var filepath = new FileInfo(@"C:\Users\user\Desktop\Test\" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx");
objExcelPackage.SaveAs(filepath);
}
public void ListFiles(ExcelPackage objExcelPackage, int worksheetIndex, string path)
{
var imageCount = 0;
var x = 25;
var finalValue = 0;
var files = Directory.GetFiles(path).Select(s => new FileInfo(s));
if (files.Any())
{
//create new worksheet
var ws = objExcelPackage.Workbook.Worksheets.Add("Worksheet" + (++worksheetIndex));
foreach (var file in files)
{
imageCount++;
var TEST_IMAGE = new System.Web.UI.WebControls.Image();
var myImage = System.Drawing.Image.FromFile(img);
var pic = ws.Drawings.AddPicture(imageCount.ToString(), myImage);
// Row, RowoffsetPixel, Column, ColumnOffSetPixel
if (imageCount > 1)
{
pic.SetPosition(finalValue, 0, 2, 0);
finalValue += (x + 1); // Add 1 to have 1 row of empty row
}
else
{
pic.SetPosition(imageCount, 0, 2, 0);
finalValue = (imageCount + x) + 1; // Add 1 to have 1 row of empty
}
}
}
foreach (var dir in Directory.GetDirectories(path))
{
this.ListFiles(objExcelPackage, worksheetIndex, dir);
}
}
答案 2 :(得分:1)
Directory.GetFiles(dir)返回 dir 中的所有文件,没有文件夹 你应该使用 Directory.EnumerateDirectories(dir)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Program
{
private static void Main(string[] args)
{
try
{
string dirPath = @"\\archives\2009\reports";
List<string> dirs = new List<string>(Directory.EnumerateDirectories(dirPath));
foreach (var dir in dirs)
{
Console.WriteLine("{0}", dir.Substring(dir.LastIndexOf("\\") + 1));
}
Console.WriteLine("{0} directories found.", dirs.Count);
}
catch (UnauthorizedAccessException UAEx)
{
Console.WriteLine(UAEx.Message);
}
catch (PathTooLongException PathEx)
{
Console.WriteLine(PathEx.Message);
}
}
}
答案 3 :(得分:1)
The Composite Pattern符合您的问题。
@objc protocol MyProtocol : NSObjectProtocol {
func method()
}
class MyClass : MulticastDelegateContainer {
typealias DelegateType = MyProtocol
var multicastDelegate = [MyProtocol]()
func testDelegates() {
invokeDelegate { $0.method() }
}
}