使用 EPPlus 翻译 Excel 单元格的位置

Use EPPlus to translate the location of the Excel Cell

我刚开始使用 EPPlus

我想定位一个单元格,相对于一个起点,实现此目的的最佳方法是什么?

例如:

var startLocation = "C5";
var newLocation1 = TLoc(startLocation, 2, 3); //E8
var newLocation2 = TLoc(startLocation, 0, 1); //C6

目前我自己写了这个方法,因为我不熟悉 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();
    }
}

请给我看一个例子或 link 我看文档。谢谢!

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

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

希望对你有所帮助,我不清楚你的问题。 但我希望你正在寻找这样的东西。

这是将整数行转换为整数列到 Excel 地址的解决方案。

您需要在数据 return 到 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;
        }
    }

这是用于地址映射的转换器Class

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;
        }
    }
}

EEPLUS 好 API Excel 自动化,

但还是简单明了

我会推荐你​​http://spreadsheetlight.com/

对于EPPlus具体的解决方案,我能想到的唯一方法是"shortest"是这样的:

//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)); 

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