Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取特定行集的最大列数_C#_.net_Excel_Visual Studio - Fatal编程技术网

C# 获取特定行集的最大列数

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

如果我想使用VisualStudio获取Excel中一组行的最大列数,该如何实现

下面是我当前的尝试,它在整个工作表中生成最大数量的列,而不是指定的行。以下是我在这方面的尝试。所有必要的东西,如使用、初始化Excel项目等都在那里,但这里没有显示

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文件?