C# 获取特定行集的最大列数
如果我想使用VisualStudio获取Excel中一组行的最大列数,该如何实现 下面是我当前的尝试,它在整个工作表中生成最大数量的列,而不是指定的行。以下是我在这方面的尝试。所有必要的东西,如使用、初始化Excel项目等都在那里,但这里没有显示C# 获取特定行集的最大列数,c#,.net,excel,visual-studio,C#,.net,Excel,Visual Studio,如果我想使用VisualStudio获取Excel中一组行的最大列数,该如何实现 下面是我当前的尝试,它在整个工作表中生成最大数量的列,而不是指定的行。以下是我在这方面的尝试。所有必要的东西,如使用、初始化Excel项目等都在那里,但这里没有显示 class Sheets { public Excel.Application app; //= new Excel.Application(); public Excel.Workbook book; // publi
class Sheets
{
public Excel.Application app; //= new Excel.Application();
public Excel.Workbook book; //
public Excel._Worksheet sheet; //= book.Sheets["XML Inputs"];
public Excel.Range range; // = sheet.UsedRange;
public Sheets()
{
app = new Excel.Application();
book = app.Workbooks.Open(@"C:\dev\Development\Joseph\Projects\PTAC XML File\PTAC XML File\Excel Read FIle 3.0.xlsx");
sheet = book.Sheets["XML Inputs"];
range = sheet.UsedRange;
int rowcount = range.Rows.Count;
int columncount = range.Columns.Count;
int i = 0;
}
public void Output()
{
Excel.Range fastrange1 = (Excel.Range)sheet.Cells[12, 1]; //fetch the number of columns for row 12
for (int i = 12; i == 12; i++) //given row 12, count the number of coulmns
{
int fastrange = range.Columns.Count;
Console.WriteLine(fastrange);
}
}您可以尝试:
Sheet.UsedRange.Columns.Count
但请注意,根据工作表的编辑历史记录,这可能会返回比预期更多的结果。也就是说,如果用户输入Z列之前的数据,则保存工作表,然后删除Z列中的数据(而不是该列),则在删除整个列之前,该数据仍可以被视为UsedRange的一部分。下面是一个示例,我们在PowerShell脚本中使用它(在.net中应该是相同的)来压缩工作表(如我所述清理实例)。这不是最有效的代码,但它可以工作
# attach to excel object
$objExcel = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application");
$book = $objExcel.ActiveWorkbook
$shtCount = $book.Sheets.Count
Write-Host $shtCount
for($i = 1; $i -le $shtCount; $i++){
$sht = $book.Worksheets.item($i)
$sht.Activate();
$sht.UsedRange.Select();
$rows = $sht.UsedRange.Rows.Count;
$columns = $sht.UsedRange.Columns.Count;
Write-Host $sht.UsedRange.Address();
Write-Host "Rows: $rows"
Write-Host "Columns: $columns"
#remove blank columns
for($c = $columns; $c -ge 1; $c--){
$hasData = 0;
for($r = 1; $r -le $rows; $r++){
$cell = $sht.Cells.Item($r, $c);
if($cell.Text -ne ""){
$hasData = 1;
break;
}
}
if($hasData){
Write-Host "Column $c Has Data";
} else{
Write-Host "Column $c Has No Data";
$cell.EntireColumn.Delete();
}
}#end for columns
#remove blank rows
for($r = $rows; $r -ge 1; $r--){
$hasData = 0;
for($c = 1; $c -le $columns; $c++){
$cell = $sht.Cells.Item($r, $c);
if($cell.Text -ne ""){
$hasData = 1;
break;
}
}
if($hasData){
Write-Host "Row $r Has Data";
} else{
Write-Host "Row $r Has No Data";
$cell.EntireRow.Delete();
}
}#end for rows
}#end for sheets
#clean up com objects
[void][System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($cell)
[void][System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($sht)
[void][System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($book)
[void][System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($objExcel)
编辑:根据评论,下面是一些难看的代码:
int maxCol = 0;
int columns = sheet.UsedRange.Columns.Count;
Range fastRange = sheet.get_Range("R12C1", "R12C" + columns); //Gets row 12 to used Range
foreach(Range r in fastRange){
if(!(String.IsNullOrEmpty(r.Text)) && r.Column > maxCol) maxCol = r.Column;
}
Console.WriteLine("Max column for row 12 is: " + maxCol);
我这么做是出于一时冲动,我认为方法调用是有效的。可以使用RxCx行-列命名格式获取单元格。如果您想获得单个单元格,请使用
获取范围(“R12C3”,键入.Missing)
。希望以上内容能让你开始。使用过的电池的测试取决于您(可能有很多选项)。我个人使用一个名为EPPlus的NuGet软件包。第一步是找到excel文档,然后循环浏览列和行
//Get file path
var excelFile = new FileInfo("your-path-here");
//Open file using epplus
using(var package = new ExcelPackage(excelFile))
{
ExcelWorkbook wkbk = package.Workbook;
//Make sure file is not empty
if(wkbk != null)
{
if(wkbk.Worksheets.Count > 0)
{
//Get the first worksheet
ExcelWorksheet curworksheet = wkbk.Worksheets.First();
//Get row count
var row = curworksheet.Dimension.End.Row;
//Get column count
var col = curworksheet.Dimension.End.Column;
//Cycle through rows
foreach(int i = 2; i <= row; i++)
{
//Cycle through columns for current row
foreach(int = 1; i <= col; i++)
{
//for each col do something...
}
}
}
}
}
//获取文件路径
var excelFile=newfileinfo(“此处的路径”);
//使用epplus打开文件
使用(var包=新的ExcelPackage(excelFile))
{
ExcelWorkbook wkbk=package.Workbook;
//确保文件不是空的
如果(wkbk!=null)
{
如果(wkbk.Worksheets.Count>0)
{
//获取第一张工作表
Excel工作表curworksheet=wkbk.Worksheets.First();
//获取行计数
var row=cursheet.Dimension.End.row;
//获取列计数
var col=cursheet.Dimension.End.Column;
//在行中循环
弗雷奇(int i=2;i在.NET/C#中可能会有很大的不同,但是我认为您关于Range.Columns.Count的建议很好。这不算整个工作表中的最大列数吗?例如,如果在第5-10行中,有4个使用过的列。对于第11-15行,有8个使用过的列。结果将产生8。我如何获取列数第5-10行中使用的ns?Clay,我为.NET/C#和PowerShell编写过。令人惊讶的是,它最终是如此相似。对于PowerShell和.NET,对象上的方法名称基本相同。JW,您必须定义“已使用”。如果一个工作表由30列组成,那么就Excel而言,所有这些列都是技术上使用的。但是,从我们的透视图如果列不包含数据(每个单元格为空),则不能使用它们。唯一的判断方法是遍历该范围并查看单元格是否返回值。但是,即使单元格为空,它也可能包含公式。因此,由程序员决定是什么原因使单元格“未使用”。我已经在代码中使用了.range(只是上面没有显示)。我需要链接列和行,而不是了解涉及循环行/列部分的工作表的所有行和列,这也是我最初的想法。我能够打开excel什么的(尽管使用不同的方法),所以我尝试在行之间循环,然后在特定行获取列(如上所示),但我没有成功。我使用int-rowcount=range.rows.Count;int-columncount=range.columns.Count;@jw.cana1以不同的方式获取行/列。您是否尝试过获取工作表的使用范围('sheet.UsedRange.columns.Count')就像李建议的那样?出于好奇,你用什么软件包来读取excel文件?