Подскажите, как написать такую же функцию на c#
Sub copyTable()
Dim colRange(), destColRange()
Dim Text As String
Dim i As Long, newI As Long, n As Long, j As Long
Dim maxLen As Long
colRange = Array(1, 2, 3, 4, 5, 6, 7) 'Columns where your data is'
destColRange = Array(10, 11, 12, 13, 14, 15, 16, 17) 'Columns where you want
'data be copied'
n = UBound(colRange) - LBound(colRange)-1
i = 2 'Initial row'
newI = i
maxLen = 500 'Maximum size allowed in one cell'
While Not (Cells(i, colRange(0)) Is Nothing) And (Cells(i, colRange(0)) <>
"")
Text = Cells(i, colRange(n))
Do
For j = 0 To n - 1
Cells(newI, destColRange(j)) = Cells(i, colRange(j))
Next j
Cells(newI, destColRange(j)) = Mid(Text, 1, maxLen)
Text = Mid(Text, maxLen + 1)
newI = newI + 1
Loop Until Len(Text) <= 0
i = i + 1
Wend
End Sub
(Поправил в коде некоторый вещи, то что мне нужно было) Вот примерно, что делает макрос.
Вот попробовал сделать так, но не получается.
static class Program
{
static void Main()
{
// тестовые данные
Excel.Application app = new Excel.Application() { Visible = true };
Excel.Workbook book = app.Workbooks.Add();
Excel.Worksheet sheet = book.Worksheets[1];
Excel.Range table = sheet.Range["a1:d4"];
table.Value = new object[,]
{
{ "h1", "h2", "h3", "h4" },
{ 11, 12, "abcdefgh", 14 },
{ 21, 22, "abcd", 24 },
{ 31, 32, "ab", 34 },
};
table.Copy(sheet.Range["f1"]);
table = sheet.Range["f1"].Resize[table.Rows.Count, table.Columns.Count];
// как-то получаем диапазон таблицы (после копирования или еще откуда-
то)
// и "вытягиваем" его по второму столбцу (нумерация с нуля)
// чтобы в нем было максимум по 3 символа
WrapRows(table, 2, 3);
}
static void WrapRows(Excel.Range table, int Column, int MaxLength)
{
object[,] oldValue = table.Value; // Получаем данные из Excel в виде
массива
object[,] newValue = oldValue
.EnumerateRows() // Перечисляем строки
.SelectMany(row => WrapRow(row, Column, MaxLength)) // каждую строку
рвем по столбцу
.ToArray() // собираем в jagged массив
.ToSolidArray(); // собираем в двумерный массив
// переносим новые данные на лист
table
.Cells[1, 1] // берем первую ячейку
// И растягиваем диапазон под размер новых данных
.Resize[newValue.GetLength(0), newValue.GetLength(1)]
.value = newValue;
}
// берет строку (в виде массива) и делит её на несколько строк разрезанных
по столбцу
static IEnumerable<object[]> WrapRow(object[] Row, int Column, int
MaxLength)
{
var text = Row[Column].ToString(); // исходная строка из ячейки
do
{
var m = Math.Min(text.Length, MaxLength);
var currentRow = Row.ToArray(); // копируем строку
currentRow[Column] = text.Substring(0, m); // вставляем часть текста
text = text.Substring(m); // удаляем вставленую часть текста
yield return currentRow;
}
while (text.Length > 0);
}
// Берет двумерный массив и пересичляет его строки как отдельные массивы
static IEnumerable<T[]> EnumerateRows<T>(this T[,] solid)
{
for (int i = 0; i < solid.GetLength(0); i++)
{
var row = new T[solid.GetLength(1)];
for (int j = 0; j < row.Length; j++)
row[j] = solid[solid.GetLowerBound(0) + i,
solid.GetLowerBound(1) + j];
yield return row;
}
}
// Преобразует рванный массив в двумерный
static T[,] ToSolidArray<T>(this T[][] jagged)
{
var solid = new T[jagged.Length, jagged[0].Length];
for (int i = 0; i < solid.GetLength(0); i++)
for (int j = 0; j < solid.GetLength(1); j++)
solid[i, j] = jagged[i][j];
return solid;
}
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Добрый день! В базе данных имеется таблица с ролями и три таблицы, отвечающие за пользователей: заказчик, типография и администраторЭти три...
Исключить из введенного предложения все слова, которые содержат заданную пользователем комбинацию из двух символов
Здравствуйте,не работает таймер js,подключения файла проверял,всё работает,пишу точно так же,как было указано на различных источниках,Js не отключён,в...
Как изменить на определенной странице нужно изменить содержимое тега, вот этого! table class="table term-marks" Есть вот такой код, но он работает на всю...