Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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# 使用EPPlus转换Excel单元格的位置_C#_Excel_Epplus - Fatal编程技术网

C# 使用EPPlus转换Excel单元格的位置

C# 使用EPPlus转换Excel单元格的位置,c#,excel,epplus,C#,Excel,Epplus,我不习惯使用 我想处理一个细胞,相对于一个起点,实现这一点的最佳方式是什么 例如: 现在我自己编写了这个方法,因为我不熟悉EPPlus的功能: /// <summary> /// Use EPPlus to translate the Location. /// </summary> /// <param name="startLocation"></param> /// <param name="columns"></param

我不习惯使用

我想处理一个细胞,相对于一个起点,实现这一点的最佳方式是什么

例如:

现在我自己编写了这个方法,因为我不熟悉EPPlus的功能:

/// <summary>
/// Use EPPlus to translate the Location.
/// </summary>
/// <param name="startLocation"></param>
/// <param name="columns"></param>
/// <param name="rows"></param>
/// <returns></returns>
private string TLoc(string startLocation, int columns, int rows)
{
    using (ExcelPackage tmpPack = new ExcelPackage())
    {
        var tmpWs = tmpPack.Workbook.Worksheets.Add("temp");
        var startCell = tmpWs.Cells[startLocation];

        int startColumn = startCell.Start.Column;
        int startRow = startCell.Start.Row;

        int tColumn = startColumn + columns;
        int tRow = startRow + rows;

        ExcelAddress translatedAddress = new ExcelAddress(tRow, tColumn, tRow, tColumn);

        return translatedAddress.ToString();
    }
}
//
///使用EPPlus转换位置。
/// 
/// 
/// 
/// 
/// 
私有字符串TLoc(字符串、整型列、整型行)
{
使用(ExcelPackage tmpPack=new ExcelPackage())
{
var tmpWs=tmpPack.Workbook.Worksheets.Add(“temp”);
var startCell=tmpWs.Cells[startLocation];
int startColumn=startCell.Start.Column;
int startRow=startCell.Start.Row;
int tColumn=startColumn+列;
int-tRow=startRow+行;
ExcelAddress translatedAddress=新的ExcelAddress(tRow,tColumn,tRow,tColumn);
返回translatedAddress.ToString();
}
}
请给我看一个例子或将我链接到文档。谢谢大家!

更具体地说:使用EPPlus实现此功能的示例


我喜欢在可用的时候使用经过验证的技术,而不是冒着引入新bug的风险。

我希望这对您有所帮助,我不清楚您的问题。 但我希望你能找到这样的东西

下面是将整数行转换为整数列并转换为Excel地址的解决方案

您需要在数据返回Excel工作表之前和之后创建地址

 public class ExcelAddress
    {
        public readonly string LabelCell;
        public readonly string ColumnAddress;
        public readonly int ColumnAddressNumber;
        public readonly int RowAddressNumber;
        public readonly string RowAddress;
        public readonly string CellAddress; // this will give you address

        public ExcelAddress(int colNum, int rowNum, string Label)
        {
            ColumnAddressNumber = colNum;
            ColumnAddress = ExcelCellAddressConvertor.FromIntegerIndexToColumnLetter(ColumnAddressNumber);
            RowAddressNumber = rowNum;
            RowAddress = RowAddressNumber.ToString();
            LabelCell = Label;
            CellAddress = ColumnAddress + RowAddress;
        }
    }
这里是地址映射的转换器类

using System;
using System.Text.RegularExpressions;

namespace BLABLA
{
    public static class ExcelCellAddressConvertor
    {
        public static string FromIntegerIndexToColumnLetter(int intCol)
        {
            var intFirstLetter = ((intCol) / 676) + 64;
            var intSecondLetter = ((intCol % 676) / 26) + 64;
            var intThirdLetter = (intCol % 26) + 65;

            var firstLetter = (intFirstLetter > 64)
                ? (char)intFirstLetter : ' ';
            var secondLetter = (intSecondLetter > 64)
                ? (char)intSecondLetter : ' ';
            var thirdLetter = (char)intThirdLetter;

            return string.Concat(firstLetter, secondLetter,
                thirdLetter).Trim();
        }

        public static int ConvertColumnNameToNumber(string columnName)
        {
            var alpha = new Regex("^[A-Z]+$");
            if (!alpha.IsMatch(columnName)) throw new ArgumentException();

            char[] colLetters = columnName.ToCharArray();
            Array.Reverse(colLetters);

            var convertedValue = 0;
            for (int i = 0; i < colLetters.Length; i++)
            {
                char letter = colLetters[i];
                // ASCII 'A' = 65
                int current = i == 0 ? letter - 65 : letter - 64;
                convertedValue += current * (int)Math.Pow(26, i);
            }

            return convertedValue;
        }
    }
}
使用系统;
使用System.Text.RegularExpressions;
命名空间BLABLA
{
公共静态类ExcelCellAddressConverter
{
从IntegerIndex到ColumnLetter的公共静态字符串(int-intCol)
{
var intFirstLetter=((intCol)/676)+64;
var intSecondLetter=((intCol%676)/26)+64;
var intThirdLetter=(intCol%26)+65;
var firstLetter=(intFirstLetter>64)
?(char)intFirstLetter:“”;
var secondLetter=(intSecondLetter>64)
?(字符)第二个字母:“”;
var thirdLetter=(char)intThirdLetter;
返回字符串.Concat(第一个字母,第二个字母,
第三者)修剪();
}
公共静态int ConvertColumnNameToNumber(字符串columnName)
{
var alpha=新正则表达式(“^[A-Z]+$”;
如果(!alpha.IsMatch(columnName))抛出新的ArgumentException();
char[]colleters=columnName.ToCharArray();
数组。反向(colLetters);
var convertedValue=0;
for(int i=0;i
EEPLUS是Excel自动化的良好API

但仍然简单明了


我建议您

使用
EPPlus
特定的解决方案,我能想到的唯一“最短”的方法是这样的:

//Prints "E8"
Console.WriteLine(ExcelCellBase.TranslateFromR1C1(ExcelCellBase.TranslateToR1C1("C5", -3, -2), 0, 0)); 

//Prints "C8"
Console.WriteLine(ExcelCellBase.TranslateFromR1C1(ExcelCellBase.TranslateToR1C1("C5", -1, 0), 0, 0)); 

虽然不是最干净的,但由于它的制造商没有公开支持这两种方法的翻译功能,很遗憾,我们不能直接使用它。

谢谢您的回答。但我正在尝试使用EPPlus软件包。上面的答案不仅适用于EPPlus,您可以用于任何您喜欢的东西…上面的答案不仅适用于EPPlus,您可以用于任何您喜欢的东西,通常它将为您提供excel地址的转换。我投票支持您的努力,但这不是我想要的。我试图简化代码,而不是引入新的bug风险。好的:)尽你所能发布清理,我很乐意解决
//Prints "E8"
Console.WriteLine(ExcelCellBase.TranslateFromR1C1(ExcelCellBase.TranslateToR1C1("C5", -3, -2), 0, 0)); 

//Prints "C8"
Console.WriteLine(ExcelCellBase.TranslateFromR1C1(ExcelCellBase.TranslateToR1C1("C5", -1, 0), 0, 0));