C# 使用EPPlus转换Excel单元格的位置
我不习惯使用 我想处理一个细胞,相对于一个起点,实现这一点的最佳方式是什么 例如: 现在我自己编写了这个方法,因为我不熟悉EPPlus的功能: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
/// <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));