usingSystem;usingSystem.IO;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Text.RegularExpressions;usingDocumentFormat.OpenXml;usingDocumentFormat.OpenXml.Packaging;usingDocumentFormat.OpenXml.Spreadsheet;namespaceOpenXMLSDK_Sample13_article{classProgram{staticvoidMain(string[]args){conststringFILE=@"C:\Users\Public\Documents\openxmlsdk20.xlsx";conststringSHEET_NAME="Sheet1";using(SpreadsheetDocumentexcelDoc=SpreadsheetDocument.Open(FILE,true)){WorkbookPartbookPart=excelDoc.WorkbookPart;intsheet_index=GetWorksheetIndex(bookPart,SHEET_NAME);WorksheetPartsheet_part=GetWorksheetPart(bookPart,sheet_index);InsertColumns(sheet_part,"C",1);InsertColumns(sheet_part,"E",2);InsertColumns(sheet_part,"H",3);}//ファイルを開くSystem.Diagnostics.Process.Start(FILE);}/// <summary>/// Excel最大行数/// </summary>publicconstuintMAX_ROW_INDEX=1048756;/// <summary>/// Excel最大列数/// </summary>publicconstuintMAX_COL_INDEX=16384;publicstaticvoidInsertColumns(WorksheetPartws_part,stringcolumn_name,uintnew_column_count=1){if(string.IsNullOrEmpty(column_name)){thrownewException("column_name should not be null or empty.");}if(new_column_count<=0){thrownewException("new_row_count must be positive.");}uintcolumn_index_at=GetColumnIndex(column_name);if(column_index_at==0){thrownewException("column_name is not valid column/cell address.");}SheetDatasheet_data_part=ws_part.Worksheet.GetFirstChild<SheetData>();/*** dimension ***/SheetDimensiondimension_modified=ws_part.Worksheet.GetFirstChild<SheetDimension>();if(isRangeAddress(dimension_modified.Reference)){stringlast_cell_address=dimension_modified.Reference.Value.Split(':')[1];if(column_index_at<=GetColumnIndex(last_cell_address)){dimension_modified.Reference=newStringValue(ShiftedRangeOnInsertColumn(dimension_modified.Reference,column_index_at,new_column_count));}else{return;}}else{return;}/*** Cell Merge ***/MergeCellsmergeCells=ws_part.Worksheet.GetFirstChild<MergeCells>();if(mergeCells!=null){foreach(MergeCellmerge_cellinmergeCells){merge_cell.Reference=ShiftedRangeOnInsertColumn(merge_cell.Reference,column_index_at,new_column_count);}}/*** Shift Column and Cell Reference ***/foreach(varrowinsheet_data_part.Elements<Row>()){foreach(varcellinrow.Elements<Cell>().Where(c=>GetColumnIndex(c.CellReference)>=column_index_at)){cell.CellReference=ShiftedRangeOnInsertColumn(cell.CellReference,column_index_at,new_column_count);}//書式を維持するためにセルを作るCellcell_previous=row.Elements<Cell>().LastOrDefault(c=>GetColumnIndex(c.CellReference.Value)<column_index_at);if(cell_previous!=null){intinsert_index_from=row.Elements<Cell>().ToList().IndexOf(cell_previous)+1;for(uintcolumn_index=column_index_at;column_index<column_index_at+new_column_count;column_index++){Cellcell=newCell(){CellReference=$"{GetColumnName(column_index)}{row.RowIndex}",StyleIndex=cell_previous.StyleIndex,DataType=cell_previous.DataType};row.InsertAt(cell,insert_index_from);insert_index_from++;}}}/*** Shift Formula Reference ***/foreach(varcellinsheet_data_part.Descendants<Cell>().Where(c=>c.CellFormula!=null)){/*** Shift Formula ***/stringformula=cell.CellFormula.Text;if(!string.IsNullOrEmpty(formula)){cell.CellFormula.Text=ShiftedRangeOnInsertColumn(formula,column_index_at,new_column_count);}stringreference=cell.CellFormula.Reference;if(!string.IsNullOrEmpty(reference)){cell.CellFormula.Reference=ShiftedRangeOnInsertColumn(cell.CellFormula.Reference,column_index_at,new_column_count);}}/*** CalcChain ***/WorkbookPartwb_part=ws_part.GetParentParts().ElementAt(0)asWorkbookPart;Sheetssheets=wb_part.RootElement.Elements<Sheets>().First();stringsheet_part_id=wb_part.GetIdOfPart(ws_part);stringsheet_id=(sheets.First(sh=>(shasSheet).Id==sheet_part_id)asSheet).SheetId;CalculationChainPartcalc_chain_part=wb_part.GetPartsOfType<CalculationChainPart>().FirstOrDefault();if(calc_chain_part!=null){foreach(CalculationCellcellincalc_chain_part.CalculationChain.Elements<CalculationCell>().Where(c=>c.SheetId==sheet_id)){cell.CellReference=ShiftedRangeOnInsertColumn(cell.CellReference,column_index_at,new_column_count);}//wb_part.DeletePart(calc_chain_part);}/*** name definition ***//*** graph ***//*** pivot table & graph ***/}publicstaticstringShiftedRangeOnInsertColumn(stringrange,uintcolumn_index_at,uintnew_column_count){Regexregex=newRegex(@"\$?[A-Za-z]+\$?[1-9][0-9]*",RegexOptions.IgnoreCase);//セル番地にマッチstringrange_shifted=range;MatchCollectionmc=regex.Matches(range);for(inti=mc.Count-1;i>=0;i--){stringrange_element_address=mc[i].ToString();if(GetColumnIndex(range_element_address)>=column_index_at){range_shifted=range_shifted.Replace(range_element_address,getOffsetAddress(range_element_address,0,(int)new_column_count));}}returnrange_shifted;}// 以下省略}}