在 C# 中使用 ExcelLibrary 创建具有多个 sheet 的多个 excel
create multiple excels with multiple sheet using ExcelLibrary in C#
我想用多个 excel 文件导出多个 sheet 中的数据。正如您在我的图片中看到的,我想在 ID
更改时生成 sheets,当 ModalityId
更改时,我想创建新的 excel.
为了这个问题我做了这样的代码:
List<string> lstFile = new List<string>();
if (dtAltTag != null && dtAltTag.Rows.Count > 0)
{
string filePath = string.Empty;
string fileName = "";
Excel.Workbook workBook = new Excel.Workbook();
var workSheet = new Excel.Worksheet(fileName);
if (dtAltTag.Rows[0]["OldFormCode"] != null && dtAltTag.Rows[0]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[0]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[0]["Code"].ToString();
}
workSheet.Name = fileName;
AddValue(0, workSheet, dtAltTag); // function is used to add the value in the sheet
workBook.Worksheets.Add(workSheet);
//data working
for (int i = 0; i < dtAltTag.Rows.Count; i++)
{
//for modality changes and first entery
//if (i == 0 || dtAltTag.Rows[i]["ModalityId"] != dtAltTag.Rows[i - 1]["ModalityId"])
//{
//if form changes then it should be in other sheet
if (i != 0 && dtAltTag.Rows[i]["ID"].ToString() != dtAltTag.Rows[i - 1]["ID"].ToString())
{
if (dtAltTag.Rows[i]["OldFormCode"] != null && dtAltTag.Rows[i]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[i]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[i]["Code"].ToString();
}
var workSheet1 = new Excel.Worksheet(fileName);
AddValue(i, workSheet1, dtAltTag);
}
else
{
}
}
filePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["ExcelFilesFilePath"]) + "Allitem";
if (!File.Exists(filePath))
Directory.CreateDirectory(filePath);
filePath = filePath + "\" + fileName + "_" + DateTime.Now.ToString("MM_dd_yyy_HH_mm_ss") + ".xls";
workBook.Save(filePath);
lstFile.Add(filePath);
}
return lstFile;
当 id 更改时,我追加新的 header 但在那之后,我想继续导出数据,直到 id 更改无法检测到如何做到这一点?
我怎样才能得到当前的 sheet 我在其他情况下继续添加值?
我希望你已经清楚我正在尝试做什么!
提前致谢!
你不能这样做吗:
- 循环数据
- 如果
ModalityId
不同,保存当前文件并创建一个新文件(将其分配回当前文件变量)
- 如果
ID
不同,则创建一个新的 sheet(将其附加到当前文件并将其分配回当前 sheet 变量)
- 将您的数据添加到当前 sheet
- 在循环外,保存当前(和最后一个)文件。
这可能是伪代码:
var currentFile = new ExcelFile();
var currentSheet = currentFile.AppendSheet(rows[0].SheetName);
string lastFileName;
for(int i = 0; i < rows.Count; i++)
{
// Adds new file if necessary
if(i != 0 && rows[i].ModalityId != rows[i - 1].ModalityId)
{
currentFile.Save(rows[i - 1].FileName);
currentFile = new ExcelFile();
}
// Adds new sheet if necessary
if(i != 0 && rows[i].ID != rows[i - 1].ID)
{
currentSheet = currentFile.AppendSheet(rows[i].SheetName);
}
InsertData(currentSheet, rows[i]);
lastFileName = rows[i].FileName;
}
currentFile.Save(lastFileName);
参考 'Rafalon' 代码,我对我的代码进行了一些更改并且它工作正常!
谢谢!
我的代码如下:
var filePath = "";
string fileName = "";
if (dtAltTag.Rows[0]["OldFormCode"] != null && dtAltTag.Rows[0]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[0]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[0]["Code"].ToString();
}
int Row = 0;
var currentFile = new Excel.Workbook();
var currentSheet = new Excel.Worksheet(fileName);
currentFile.Worksheets.Add(currentSheet);
List<string> lstFile = new List<string>();
if (dtAltTag != null && dtAltTag.Rows.Count > 0)
{
for (int i = 0; i < dtAltTag.Rows.Count; i++)
{
if (i == 0)
{
AddValue(i, currentSheet, dtAltTag, Row);
}
else
{
if (dtAltTag.Rows[i]["ModalityId"].ToString() != dtAltTag.Rows[i - 1]["ModalityId"].ToString())
{
filePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["ExcelFilesFilePath"]) + "Allitem";
if (!File.Exists(filePath))
Directory.CreateDirectory(filePath);
filePath = filePath + "\" + fileName + "_" + DateTime.Now.ToString("MM_dd_yyy_HH_mm_ss") + ".xls";
lstFile.Add(filePath);
currentFile.Save(filePath);
currentFile = new Excel.Workbook();
}
if (dtAltTag.Rows[i]["ID"].ToString() != dtAltTag.Rows[i - 1]["ID"].ToString())
{
if (dtAltTag.Rows[i]["OldFormCode"] != null && dtAltTag.Rows[i]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[i]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[i]["Code"].ToString();
}
currentSheet = new Excel.Worksheet(fileName);
currentFile.Worksheets.Add(currentSheet);
Row = 0;
}
AddValue(i, currentSheet, dtAltTag, Row);
}
Row++;
}
filePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["ExcelFilesFilePath"]) + "Allitem";
if (!File.Exists(filePath))
Directory.CreateDirectory(filePath);
filePath = filePath + "\" + fileName + "_" + DateTime.Now.ToString("MM_dd_yyy_HH_mm_ss") + ".xls";
currentFile.Save(filePath);
lstFile.Add(filePath);
}
这个在sheet中增加值的函数可能会有用:
private void AddValue(int i, Excel.Worksheet workSheet, DataTable dtAltTag, int Row)
{
//Header Working starts here
string[] columName = new string[] { "column1", "column2", "column2", "column2", "column2" }; //add header as per you requirement
if (Row == 0)
{
for (int c = 0; c < columName.Length; c++)
{
workSheet.Cells[0, c] = new Excel.Cell(columName[c]);
}
}
//add data
for (int c = 0; c < columName.Length; c++)
{
workSheet.Cells[Row + 1, c] = new Excel.Cell(dtAltTag.Rows[i].ItemArray[c].ToString());
}
}
我想用多个 excel 文件导出多个 sheet 中的数据。正如您在我的图片中看到的,我想在 ID
更改时生成 sheets,当 ModalityId
更改时,我想创建新的 excel.
为了这个问题我做了这样的代码:
List<string> lstFile = new List<string>();
if (dtAltTag != null && dtAltTag.Rows.Count > 0)
{
string filePath = string.Empty;
string fileName = "";
Excel.Workbook workBook = new Excel.Workbook();
var workSheet = new Excel.Worksheet(fileName);
if (dtAltTag.Rows[0]["OldFormCode"] != null && dtAltTag.Rows[0]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[0]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[0]["Code"].ToString();
}
workSheet.Name = fileName;
AddValue(0, workSheet, dtAltTag); // function is used to add the value in the sheet
workBook.Worksheets.Add(workSheet);
//data working
for (int i = 0; i < dtAltTag.Rows.Count; i++)
{
//for modality changes and first entery
//if (i == 0 || dtAltTag.Rows[i]["ModalityId"] != dtAltTag.Rows[i - 1]["ModalityId"])
//{
//if form changes then it should be in other sheet
if (i != 0 && dtAltTag.Rows[i]["ID"].ToString() != dtAltTag.Rows[i - 1]["ID"].ToString())
{
if (dtAltTag.Rows[i]["OldFormCode"] != null && dtAltTag.Rows[i]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[i]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[i]["Code"].ToString();
}
var workSheet1 = new Excel.Worksheet(fileName);
AddValue(i, workSheet1, dtAltTag);
}
else
{
}
}
filePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["ExcelFilesFilePath"]) + "Allitem";
if (!File.Exists(filePath))
Directory.CreateDirectory(filePath);
filePath = filePath + "\" + fileName + "_" + DateTime.Now.ToString("MM_dd_yyy_HH_mm_ss") + ".xls";
workBook.Save(filePath);
lstFile.Add(filePath);
}
return lstFile;
当 id 更改时,我追加新的 header 但在那之后,我想继续导出数据,直到 id 更改无法检测到如何做到这一点? 我怎样才能得到当前的 sheet 我在其他情况下继续添加值?
我希望你已经清楚我正在尝试做什么!
提前致谢!
你不能这样做吗:
- 循环数据
- 如果
ModalityId
不同,保存当前文件并创建一个新文件(将其分配回当前文件变量) - 如果
ID
不同,则创建一个新的 sheet(将其附加到当前文件并将其分配回当前 sheet 变量) - 将您的数据添加到当前 sheet
- 在循环外,保存当前(和最后一个)文件。
这可能是伪代码:
var currentFile = new ExcelFile();
var currentSheet = currentFile.AppendSheet(rows[0].SheetName);
string lastFileName;
for(int i = 0; i < rows.Count; i++)
{
// Adds new file if necessary
if(i != 0 && rows[i].ModalityId != rows[i - 1].ModalityId)
{
currentFile.Save(rows[i - 1].FileName);
currentFile = new ExcelFile();
}
// Adds new sheet if necessary
if(i != 0 && rows[i].ID != rows[i - 1].ID)
{
currentSheet = currentFile.AppendSheet(rows[i].SheetName);
}
InsertData(currentSheet, rows[i]);
lastFileName = rows[i].FileName;
}
currentFile.Save(lastFileName);
参考 'Rafalon' 代码,我对我的代码进行了一些更改并且它工作正常! 谢谢!
我的代码如下:
var filePath = "";
string fileName = "";
if (dtAltTag.Rows[0]["OldFormCode"] != null && dtAltTag.Rows[0]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[0]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[0]["Code"].ToString();
}
int Row = 0;
var currentFile = new Excel.Workbook();
var currentSheet = new Excel.Worksheet(fileName);
currentFile.Worksheets.Add(currentSheet);
List<string> lstFile = new List<string>();
if (dtAltTag != null && dtAltTag.Rows.Count > 0)
{
for (int i = 0; i < dtAltTag.Rows.Count; i++)
{
if (i == 0)
{
AddValue(i, currentSheet, dtAltTag, Row);
}
else
{
if (dtAltTag.Rows[i]["ModalityId"].ToString() != dtAltTag.Rows[i - 1]["ModalityId"].ToString())
{
filePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["ExcelFilesFilePath"]) + "Allitem";
if (!File.Exists(filePath))
Directory.CreateDirectory(filePath);
filePath = filePath + "\" + fileName + "_" + DateTime.Now.ToString("MM_dd_yyy_HH_mm_ss") + ".xls";
lstFile.Add(filePath);
currentFile.Save(filePath);
currentFile = new Excel.Workbook();
}
if (dtAltTag.Rows[i]["ID"].ToString() != dtAltTag.Rows[i - 1]["ID"].ToString())
{
if (dtAltTag.Rows[i]["OldFormCode"] != null && dtAltTag.Rows[i]["OldFormCode"].ToString() != "")
{
fileName = dtAltTag.Rows[i]["OldFormCode"].ToString();
}
else
{
fileName = dtAltTag.Rows[i]["Code"].ToString();
}
currentSheet = new Excel.Worksheet(fileName);
currentFile.Worksheets.Add(currentSheet);
Row = 0;
}
AddValue(i, currentSheet, dtAltTag, Row);
}
Row++;
}
filePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["ExcelFilesFilePath"]) + "Allitem";
if (!File.Exists(filePath))
Directory.CreateDirectory(filePath);
filePath = filePath + "\" + fileName + "_" + DateTime.Now.ToString("MM_dd_yyy_HH_mm_ss") + ".xls";
currentFile.Save(filePath);
lstFile.Add(filePath);
}
这个在sheet中增加值的函数可能会有用:
private void AddValue(int i, Excel.Worksheet workSheet, DataTable dtAltTag, int Row)
{
//Header Working starts here
string[] columName = new string[] { "column1", "column2", "column2", "column2", "column2" }; //add header as per you requirement
if (Row == 0)
{
for (int c = 0; c < columName.Length; c++)
{
workSheet.Cells[0, c] = new Excel.Cell(columName[c]);
}
}
//add data
for (int c = 0; c < columName.Length; c++)
{
workSheet.Cells[Row + 1, c] = new Excel.Cell(dtAltTag.Rows[i].ItemArray[c].ToString());
}
}